/** * 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; }
/** * 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; }
/** * @dataProvider providerTestGetFieldName **/ public function testGetFieldName($expected, $baseName, $includingClassID = false) { self::assertEquals($expected, eZSolr::getFieldName($baseName, $includingClassID)); }