/**
  * Modifies SolR query params according to filter parameters
  * @param array $queryParams
  * @param array $filterParams
  * @return array $queryParams
  */
 public function filterQueryParams(array $queryParams, array $filterParams)
 {
     try {
         if (!isset($filterParams['field'])) {
             throw new Exception('Missing filter parameter "field"');
         }
         if (!isset($filterParams['latitude'])) {
             throw new Exception('Missing filter parameter "latitude"');
         }
         if (!isset($filterParams['longitude'])) {
             throw new Exception('Missing filter parameter "longitude"');
         }
         $fieldName = eZSolr::getFieldName($filterParams['field']);
         //geodist custom parameters
         $queryParams['sfield'] = $fieldName;
         $queryParams['pt'] = $filterParams['latitude'] . ',' . $filterParams['longitude'];
         //sort by geodist
         $queryParams['sort'] = 'geodist() asc,' . $queryParams['sort'];
         //exclude unlocated documents
         $queryParams['fq'][] = $fieldName . ':[-90,-90 TO 90,90]';
     } catch (Exception $e) {
         eZDebug::writeWarning($e->getMessage(), __CLASS__);
     }
     return $queryParams;
 }
Esempio n. 2
0
 /**
  * Build facet parameter list. This function extracts the facet parameter from
  * the ezfeZPSolrQueryBuilder::search( ...,$params parameter.
  *
  * @todo specify dedicated facet fields (may be mapped to sort fields)
  *
  * @param array Parameter list array
  *
  * @return array List of Facet query parameter. The facet parameter corrosponds to
  * the parameters defined here : http://wiki.apache.org/solr/SimpleFacetParameters
  */
 protected function buildFacetQueryParamList($parameterList)
 {
     $parameterList = array_change_key_case($parameterList, CASE_LOWER);
     $queryParamList = array();
     if (empty($parameterList['facet'])) {
         return $queryParamList;
     }
     // Loop through facet definitions, and build facet query.
     foreach ($parameterList['facet'] as $facetDefinition) {
         if (empty($facetDefinition['field']) and empty($facetDefinition['query']) and empty($facetDefinition['date']) and empty($facetDefinition['range']) and empty($facetDefinition['prefix'])) {
             eZDebug::writeDebug('No facet field or query provided.', __METHOD__);
             continue;
         }
         $queryPart = array();
         if (!empty($facetDefinition['field'])) {
             switch ($facetDefinition['field']) {
                 case 'author':
                     $queryPart['field'] = eZSolr::getMetaFieldName('owner_id', 'facet');
                     break;
                 case 'class':
                     $queryPart['field'] = eZSolr::getMetaFieldName('contentclass_id', 'facet');
                     break;
                 case 'installation':
                     $queryPart['field'] = eZSolr::getMetaFieldName('installation_id', 'facet');
                     break;
                 case 'translation':
                     $queryPart['field'] = eZSolr::getMetaFieldName('language_code', 'facet');
                     break;
                 default:
                     $fieldName = eZSolr::getFieldName($facetDefinition['field'], false, 'facet');
                     if (!$fieldName and empty($facetDefinition['date'])) {
                         eZDebug::writeNotice('Facet field does not exist in local installation, but may still be valid: ' . $facetDefinition['field'], __METHOD__);
                         continue;
                     }
                     $queryPart['field'] = $fieldName;
                     break;
             }
         }
         // Get query part.
         if (!empty($facetDefinition['query'])) {
             list($field, $query) = explode(':', $facetDefinition['query'], 2);
             $field = eZSolr::getFieldName($field, false, 'facet');
             if (!$field) {
                 eZDebug::writeNotice('Invalid query field provided: ' . $facetDefinition['query'], __METHOD__);
                 continue;
             }
             $queryPart['query'] = $field . ':' . $query;
         }
         // Get prefix.
         // TODO: make this per mandatory per field in order to construct f.<fieldname>.facet.prefix queries
         if (!empty($facetDefinition['prefix'])) {
             $queryPart['prefix'] = $facetDefinition['prefix'];
         }
         // range facets: fill the $queryParamList array directly
         if (!empty($facetDefinition['range']) && !empty($facetDefinition['range']['field']) && !empty($facetDefinition['range']['start']) && !empty($facetDefinition['range']['end']) && !empty($facetDefinition['range']['gap'])) {
             $fieldName = '';
             switch ($facetDefinition['range']['field']) {
                 case 'published':
                     $fieldName = eZSolr::getMetaFieldName('published', 'facet');
                     break;
                 case 'modified':
                     $fieldName = eZSolr::getMetaFieldName('modified', 'facet');
                     break;
                 default:
                     $fieldName = eZSolr::getFieldName($facetDefinition['field'], false, 'facet');
             }
             $perFieldRangePrefix = 'f.' . $fieldName . '.facet.range';
             $queryParamList['facet.range'] = $fieldName;
             $queryParamList[$perFieldRangePrefix . '.start'] = $facetDefinition['range']['start'];
             $queryParamList[$perFieldRangePrefix . '.end'] = $facetDefinition['range']['end'];
             $queryParamList[$perFieldRangePrefix . '.gap'] = $facetDefinition['range']['gap'];
             if (!empty($facetDefinition['range']['hardend'])) {
                 $queryParamList[$perFieldRangePrefix . '.hardend'] = $facetDefinition['range']['hardend'];
             }
             if (!empty($facetDefinition['range']['include'])) {
                 $queryParamList[$perFieldRangePrefix . '.include'] = $facetDefinition['range']['include'];
             }
             if (!empty($facetDefinition['range']['other'])) {
                 $queryParamList[$perFieldRangePrefix . '.other'] = $facetDefinition['range']['other'];
             }
         }
         // Get sort option.
         if (!empty($facetDefinition['sort'])) {
             switch (strtolower($facetDefinition['sort'])) {
                 case 'count':
                     $queryPart['sort'] = 'true';
                     break;
                 case 'alpha':
                     $queryPart['sort'] = 'false';
                     break;
                 default:
                     eZDebug::writeWarning('Invalid sort option provided: ' . $facetDefinition['sort'], __METHOD__);
                     break;
             }
         }
         // Get limit option
         if (!empty($facetDefinition['limit'])) {
             $queryPart['limit'] = $facetDefinition['limit'];
         } else {
             $queryPart['limit'] = ezfeZPSolrQueryBuilder::FACET_LIMIT;
         }
         // Get offset
         if (isset($facetDefinition['offset'])) {
             $queryPart['offset'] = $facetDefinition['offset'];
         } else {
             $queryPart['offset'] = ezfeZPSolrQueryBuilder::FACET_OFFSET;
         }
         // Get mincount
         if (isset($facetDefinition['mincount'])) {
             $queryPart['mincount'] = $facetDefinition['mincount'];
         } else {
             $queryPart['mincount'] = ezfeZPSolrQueryBuilder::FACET_MINCOUNT;
         }
         // Get missing option.
         if (!empty($facetDefinition['missing'])) {
             $queryPart['missing'] = 'true';
         }
         // Get date start option - may add validation later.
         if (!empty($facetDefinition['date'])) {
             $fieldName = eZSolr::getFieldName($facetDefinition['date'], false, 'facet');
             if (!$fieldName) {
                 eZDebug::writeNotice('Facet field does not exist in local installation, but may still be valid: ' . $facetDefinition['date'], __METHOD__);
                 continue;
             } else {
                 $queryPart['date'] = $fieldName;
             }
         }
         // Get date start option - may add validation later.
         if (!empty($facetDefinition['date.start'])) {
             $queryPart['date.start'] = $facetDefinition['date.start'];
         }
         // Get date end option - may add validation later.
         if (!empty($facetDefinition['date.end'])) {
             $queryPart['date.end'] = $facetDefinition['date.end'];
         }
         // Get date gap option - may add validation later.
         if (!empty($facetDefinition['date.gap'])) {
             $queryPart['date.gap'] = $facetDefinition['date.gap'];
         }
         // Get date hardend option - may add validation later.
         if (!empty($facetDefinition['date.hardend'])) {
             $queryPart['date.hardend'] = $facetDefinition['date.hardend'];
         }
         // Get date hardend option - may add validation later.
         if (!empty($facetDefinition['date.other'])) {
             switch (strtolower($facetDefinition['date.other'])) {
                 case 'before':
                 case 'after':
                 case 'between':
                 case 'none':
                 case 'all':
                     $queryPart['date.other'] = strtolower($facetDefinition['date.other']);
                     break;
                 default:
                     eZDebug::writeWarning('Invalid option gived for date.other: ' . $facetDefinition['date.other'], __METHOD__);
             }
         }
         if (!empty($queryPart)) {
             foreach ($queryPart as $key => $value) {
                 // check for fully prepared parameter names, like the per field options
                 if (strpos($key, 'f.') === 0) {
                     $queryParamList[$key] = $value;
                 } elseif ($key !== 'field' && !empty($queryParamList['facet.' . $key]) && isset($queryPart['field'])) {
                     // local override for one given facet
                     $queryParamList['f.' . $queryPart['field'] . '.facet.' . $key][] = $value;
                 } else {
                     // global value
                     $queryParamList['facet.' . $key][] = $value;
                 }
             }
         }
     }
     if (!empty($queryParamList)) {
         $queryParamList['facet'] = 'true';
     }
     return $queryParamList;
 }
Esempio n. 3
0
 /**
  * @dataProvider providerTestGetFieldName
  **/
 public function testGetFieldName($expected, $baseName, $includingClassID = false)
 {
     self::assertEquals($expected, eZSolr::getFieldName($baseName, $includingClassID));
 }