+
+ /**
+ * Query database for places that match this search.
+ *
+ * @param object $oDB Database connection to use.
+ * @param mixed[] $aWordFrequencyScores Number of times tokens appears
+ * overall in a planet database.
+ * @param integer $iMinRank Minimum address rank to restrict
+ * search to.
+ * @param integer $iMaxRank Maximum address rank to restrict
+ * search to.
+ * @param integer $iLimit Maximum number of results.
+ *
+ * @return mixed[] An array with two fields: IDs contains the list of
+ * matching place IDs and houseNumber the houseNumber
+ * if appicable or -1 if not.
+ */
+ public function query(&$oDB, &$aWordFrequencyScores, $iMinRank, $iMaxRank, $iLimit)
+ {
+ $aResults = array();
+ $iHousenumber = -1;
+
+ if ($this->sCountryCode
+ && !sizeof($this->aName)
+ && !$this->iOperator
+ && !$this->sClass
+ && !$this->oContext->hasNearPoint()
+ ) {
+ // Just looking for a country - look it up
+ if (4 >= $iMinRank && 4 <= $iMaxRank) {
+ $aResults = $this->queryCountry($oDB);
+ }
+ } elseif (!sizeof($this->aName) && !sizeof($this->aAddress)) {
+ // Neither name nor address? Then we must be
+ // looking for a POI in a geographic area.
+ if ($this->oContext->isBoundedSearch()) {
+ $aResults = $this->queryNearbyPoi($oDB, $iLimit);
+ }
+ } elseif ($this->iOperator == Operator::POSTCODE) {
+ // looking for postcode
+ $aResults = $this->queryPostcode($oDB, $iLimit);
+ } else {
+ // Ordinary search:
+ // First search for places according to name and address.
+ $aResults = $this->queryNamedPlace(
+ $oDB,
+ $aWordFrequencyScores,
+ $iMinRank,
+ $iMaxRank,
+ $iLimit
+ );
+
+ //now search for housenumber, if housenumber provided
+ if ($this->sHouseNumber && sizeof($aResults)) {
+ $aNamedPlaceIDs = $aResults;
+ $aResults = $this->queryHouseNumber($oDB, $aNamedPlaceIDs, $iLimit);
+
+ if (!sizeof($aResults) && $this->looksLikeFullAddress()) {
+ $aResults = $aNamedPlaceIDs;
+ }
+ }
+
+ // finally get POIs if requested
+ if ($this->sClass && sizeof($aResults)) {
+ $aResults = $this->queryPoiByOperator($oDB, $aResults, $iLimit);
+ }
+ }
+
+ if (CONST_Debug) {
+ echo '<br><b>Place IDs:</b> ';
+ var_dump(array_keys($aResults));
+ }
+
+ if (sizeof($aResults) && $this->sPostcode) {
+ $sPlaceIds = Result::joinIdsByTable($aResults, Result::TABLE_PLACEX);
+ if ($sPlaceIds) {
+ $sSQL = 'SELECT place_id FROM placex';
+ $sSQL .= ' WHERE place_id in ('.$sPlaceIds.')';
+ $sSQL .= " AND postcode = '".$this->sPostcode."'";
+ if (CONST_Debug) var_dump($sSQL);
+ $aFilteredPlaceIDs = chksql($oDB->getCol($sSQL));
+ if ($aFilteredPlaceIDs) {
+ $aNewResults = array();
+ foreach ($aFilteredPlaceIDs as $iPlaceId) {
+ $aNewResults[$iPlaceId] = $aResults[$iPlaceId];
+ }
+ $aResults = $aNewResults;
+ if (CONST_Debug) {
+ echo '<br><b>Place IDs after postcode filtering:</b> ';
+ var_dump(array_keys($aResults));
+ }
+ }
+ }
+ }
+
+ return $aResults;
+ }
+
+
+ private function queryCountry(&$oDB)