Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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);
 }
Example #3
0
 /**
  * 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);
 }
Example #4
0
 /**
  * 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);
 }
Example #5
0
 /**
  * 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);
 }