// If the token is valid
if (isset($aValidTokens[' '.$sToken])) {
+ // TODO variable should go into aCurrentSearch
+ $bHavePostcode = false;
foreach ($aValidTokens[' '.$sToken] as $aSearchTerm) {
$aSearch = $aCurrentSearch;
$aSearch['iSearchRank']++;
}
if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
}
- } elseif ($sPhraseType == 'postalcode' || ($aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'postcode')) {
+ } elseif (($sPhraseType == '' || $sPhraseType == 'postalcode') && $aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'postcode') {
// We need to try the case where the postal code is the primary element (i.e. no way to tell if it is (postalcode, city) OR (city, postalcode) so try both
- if ($aSearch['sPostcode'] === '' && $aSearch['sHouseNumber'] === '' &&
+ if (!$bHavePostcode && $aSearch['sPostcode'] === '' && $aSearch['sHouseNumber'] === '' &&
isset($aSearchTerm['word']) && $aSearchTerm['word'] && strpos($sNormQuery, $this->normTerm($aSearchTerm['word'])) !== false) {
// If we have structured search or this is the first term,
// make the postcode the primary search element.
$aNewSearch = $aSearch;
$aNewSearch['sOperator'] = 'postcode';
$aNewSearch['aAddress'] = array_merge($aNewSearch['aAddress'], $aNewSearch['aName']);
- $aNewSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word'];
+ $aNewSearch['aName'] = array($aSearchTerm['word_id'] => $aSearchTerm['word']);
if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aNewSearch;
+ $bHavePostcode = true;
}
// If we have a structured search or this is not the first term,
// require a normalized exact match of the term
// if we have the normalizer version of the query
// available
- if ($aSearch['sClass'] === ''
+ if ($aSearch['sOperator'] === ''
&& ($sNormQuery === null || !($aSearchTerm['word'] && strpos($sNormQuery, $aSearchTerm['word']) === false))) {
$aSearch['sClass'] = $aSearchTerm['class'];
$aSearch['sType'] = $aSearchTerm['type'];
continue;
}
- $sToken = chksql($this->oDB->getOne("SELECT make_standard_name('".$aSpecialTerm[1]."') AS string"));
+ $sToken = chksql($this->oDB->getOne("SELECT make_standard_name('".pg_escape_string($aSpecialTerm[1])."') AS string"));
$sSQL = 'SELECT * ';
$sSQL .= 'FROM ( ';
$sSQL .= ' SELECT word_id, word_token, word, class, type, country_code, operator';