/** * 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) . " ]"); }
/** * 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']); }
/** * 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); }