Пример #1
0
 /**
  * This test performs Solr searches using multifacets and checks whether they work 
  * as expected (adding 'OR something' to filter query should increase count of returned records 
  * in at least one case). 
  */
 public function testMultiFacetsSearch()
 {
     //configuration
     $solr = $this->getServiceManager()->get('VuFind\\Search\\BackendManager')->get('Solr');
     $connector = $solr->getConnector();
     $this->assertNotNull($connector);
     $config = $this->getServiceManager()->get('VuFind\\Config');
     $this->assertNotNull($config);
     $options = new Options($config);
     $this->assertNotNull($options);
     $params = new Params($options, $config);
     $this->assertNotNull($params);
     $testedFields = array('institution', 'format');
     //try each field
     foreach ($testedFields as $currentField) {
         $params->addFacet($currentField, $currentField);
         $paramBag = $params->getBackendParameters();
         $this->assertTrue(is_array($paramBag->get('facet')));
         $query = new Query("*:*");
         $collection = $solr->search($query, 0, 0, $paramBag);
         $this->assertNotNull($collection);
         //get all possible filter values of current facet field
         $facets = $collection->getFacets()->getFieldFacets()->getArrayCopy();
         $list = $facets[$currentField];
         $list->rewind();
         $allFilters = array();
         while ($list->valid()) {
             $allFilters[] = $list->key();
             $list->next();
         }
         for ($i = 0; $i < count($allFilters); $i++) {
             for ($j = $i + 1; $j < count($allFilters); $j++) {
                 //test all possible pairs of filters for current facet field
                 $params = new Params($options, $config);
                 $params->addFacet($currentField, $currentField);
                 $params->setMultiselectFacets(array($currentField));
                 $params->addFilter($currentField . ':' . $allFilters[$i]);
                 $paramBag = $params->getBackendParameters();
                 $collection = $solr->search($query, 0, 0, $paramBag);
                 $this->assertNotNull($collection);
                 $total1 = $collection->getTotal();
                 $params->addFilter($currentField . ':' . $allFilters[$j]);
                 $paramBag = $params->getBackendParameters();
                 $collection = $solr->search($query, 0, 0, $paramBag);
                 $this->assertNotNull($collection);
                 $this->assertNotNull($collection);
                 $total2 = $collection->getTotal();
                 if ($total2 > $total1) {
                     //adding multifacet filter caused increasment of records in search results , we're done
                     return;
                 }
             }
         }
     }
     $this->fail("Multifacets test failed, multifacets has no effect on solr response." . " Tested fields: [ " . implode(", ", $testedFields) . " ]");
 }
Пример #2
0
 /**
  * Initialize date range filter (search_daterange_mv)
  *
  * @param \Zend\StdLib\Parameters $request Parameter object representing user
  * request.
  *
  * @return void
  */
 public function initSpatialDateRangeFilter($request)
 {
     $type = $request->get('search_daterange_mv_type');
     if (!$type) {
         $type = $request->get('search_sdaterange_mvtype');
     }
     if (!$type) {
         $type = 'overlap';
     }
     $dateFilter = [];
     $dateFilter['type'] = $type;
     $from = $to = null;
     $filters = $this->getFilters();
     $found = false;
     // VuFind1/VuFind2 date range filter
     if ($reqFilters = $request->get('filter')) {
         foreach ($reqFilters as $f) {
             list($field, $value) = $this->parseFilter($f);
             $daterange_VF1 = $field == self::SPATIAL_DATERANGE_FIELD_VF1;
             $daterange = $field == self::SPATIAL_DATERANGE_FIELD;
             if ($daterange || $daterange_VF1) {
                 if ($range = Utils::parseSpatialDateRange($f, $type, $daterange)) {
                     $from = $range['from'];
                     $to = $range['to'];
                     $found = true;
                     break;
                 }
             }
         }
     }
     // Uninitialized VuFind1 date range query
     if (!$found && $request->get('sdaterange')) {
         // Search for VuFind1 search_sdaterange_mvfrom, search_sdaterange_mvto
         $from = $request->get('search_sdaterange_mvfrom');
         if ($from === null) {
             $from = -9999;
         }
         $to = $request->get('search_sdaterange_mvto');
         if ($to === null) {
             $to = 9999;
         }
         $vufind2Range = false;
         $found = true;
     }
     $this->spatialDateRangeFilter = $dateFilter;
     if (!$found) {
         return;
     }
     $dateFilter['to'] = $to;
     $dateFilter['from'] = $from;
     $dateFilter['val'] = "[{$from} TO {$to}]";
     $dateFilter['field'] = self::SPATIAL_DATERANGE_FIELD;
     $dateFilter['query'] = $dateFilter['field'] . ':' . $dateFilter['val'];
     $this->spatialDateRangeFilter = $dateFilter;
     parent::addFilter($dateFilter['query']);
 }
Пример #3
0
 /**
  * Initialize date range filter (search_daterange_mv)
  *
  * @param \Zend\StdLib\Parameters $request Parameter object representing user
  * request.
  *
  * @return void
  */
 public function initSpatialDateRangeFilter($request)
 {
     $dateRangeField = $this->getDateRangeSearchField();
     if (!$dateRangeField) {
         return;
     }
     $type = $request->get("{$dateRangeField}_type");
     if (!$type) {
         // VuFind 1
         $type = $request->get(self::SPATIAL_DATERANGE_FIELD_TYPE_VF1);
     }
     if (!$type) {
         $type = 'overlap';
     }
     $from = $to = null;
     $filters = $this->getFilters();
     $found = false;
     // Date range filter
     if (($reqFilters = $request->get('filter')) && is_array($reqFilters)) {
         foreach ($reqFilters as $f) {
             list($field, $value) = $this->parseFilter($f);
             if ($field == $dateRangeField || $field == self::SPATIAL_DATERANGE_FIELD_VF1) {
                 if ($range = $this->parseDateRangeFilter($f)) {
                     $from = $range['from'];
                     $to = $range['to'];
                     if (isset($range['type'])) {
                         $type = $range['type'];
                     }
                     $found = true;
                     break;
                 }
             }
         }
     }
     // Uninitialized VuFind1 date range query
     if (!$found && $request->get('sdaterange')) {
         // Search for VuFind1 search_sdaterange_mvfrom, search_sdaterange_mvto
         $from = $request->get('search_sdaterange_mvfrom');
         $to = $request->get('search_sdaterange_mvto');
         if (!empty($from) || !empty($to)) {
             if (empty($from)) {
                 $from = -9999;
             }
             if (empty($to)) {
                 $to = 9999;
             }
             $found = true;
         }
     }
     if (!$found) {
         return;
     }
     // Add filter. The final Solr filter is constructed in getFilterSettings.
     $filter = "{$dateRangeField}:{$type}|[{$from} TO {$to}]";
     parent::addFilter($filter);
 }