Revision: 51165 Author: yaron Date: 2009-05-29 20:31:15 +0000 (Fri, 29 May 2009)
Log Message: ----------- Patch by Thomas Fellows to get proximity-based queries working Modified Paths: -------------- trunk/extensions/SemanticMediaWiki/includes/SMW_QueryProcessor.php trunk/extensions/SemanticMediaWiki/includes/storage/SMW_Query.php trunk/extensions/SemanticMediaWiki/includes/storage/SMW_SQLStore2_Queries.php Modified: trunk/extensions/SemanticMediaWiki/includes/SMW_QueryProcessor.php =================================================================== --- trunk/extensions/SemanticMediaWiki/includes/SMW_QueryProcessor.php 2009-05-29 20:30:51 UTC (rev 51164) +++ trunk/extensions/SemanticMediaWiki/includes/SMW_QueryProcessor.php 2009-05-29 20:31:15 UTC (rev 51165) @@ -22,6 +22,27 @@ const CONCEPT_DESC = 2; // query for concept definition /** + * Handle the 'distance' parameter, used for location-based queries + */ + static function setQueryDistance($distance, &$query) { + $dist_components = explode(' ', $distance); + if (count($dist_components) != 2) return; + $dist_num = $dist_components[0]; //str_replace(",", "", $dist2[0]); + if (! is_numeric($dist_num) || $dist_num < 0) return; + $dist_unit = $dist_components[1]; + $metric_units = array("km", "kms", "kilometer", "kilometers", "kilometre", "kilometres", "KM", "KMS", "Kilometer", "Kilometers", "Kilometre", "Kilometres"); + $english_units = array("mile", "mi", "miles", "mis", "Mile", "Miles", "MI", "MIS"); + if (! in_array($dist_unit, $metric_units) && ! in_array($dist_unit, $english_units)) + return; + // if we're still here, set the distance - it's computed as + // a number of miles + if (in_array($dist_unit, $metric_units)) { + $dist_num *= .621371192; + } + $query->setDistance($dist_num); + } + + /** * Parse a query string given in SMW's query language to create * an SMWQuery. Parameters are given as key-value-pairs in the * given array. The parameter $context defines in what context the @@ -113,6 +134,12 @@ $orders = Array(); } reset($orders); + // get distance to search for location-based queries + if ( array_key_exists('distance', $params) ) { + $distance = trim($params['distance']); + self::setQueryDistance( $distance, &$query ); + } + if ( array_key_exists('sort', $params) ) { $query->sort = true; $query->sortkeys = Array(); Modified: trunk/extensions/SemanticMediaWiki/includes/storage/SMW_Query.php =================================================================== --- trunk/extensions/SemanticMediaWiki/includes/storage/SMW_Query.php 2009-05-29 20:30:51 UTC (rev 51164) +++ trunk/extensions/SemanticMediaWiki/includes/storage/SMW_Query.php 2009-05-29 20:31:15 UTC (rev 51165) @@ -44,6 +44,7 @@ protected $m_inline; // query used inline? (required for finding right default parameters) protected $m_concept; // query used in concept? (required for finding right default parameters) protected $m_extraprintouts = array(); // SMWPrintoutRequest objects supplied outside querystring + protected $m_distance = 5; // default is 5 miles /** * Constructor. @@ -154,6 +155,15 @@ return $this->m_limit; } + public function setDistance($distance) { + $this->m_distance = $distance; + return $this->m_distance; + } + + public function getDistance() { + return $this->m_distance; + } + /** * Apply structural restrictions to the current description. */ Modified: trunk/extensions/SemanticMediaWiki/includes/storage/SMW_SQLStore2_Queries.php =================================================================== --- trunk/extensions/SemanticMediaWiki/includes/storage/SMW_SQLStore2_Queries.php 2009-05-29 20:30:51 UTC (rev 51164) +++ trunk/extensions/SemanticMediaWiki/includes/storage/SMW_SQLStore2_Queries.php 2009-05-29 20:31:15 UTC (rev 51165) @@ -153,6 +153,7 @@ $this->m_hierarchies = array(); $this->m_querylog = array(); $this->m_errors = array(); + $this->m_distance = $query->getDistance(); SMWSQLStore2Query::$qnum = 0; $this->m_sortkeys = $query->sortkeys; // manually make final root query (to retrieve namespace,title): @@ -577,7 +578,12 @@ if ($dv->getTypeID() == '_str') { $comp = ' LIKE '; $value = str_replace(array('%', '_', '*', '?'), array('\%', '\_', '%', '_'), $value); - } else { // LIKE only supported for strings + } elseif ($dv->getTypeID() == '_geo') { + $comp = '<='; + $geoarray = explode(",", $value); + $field = "ROUND(((ACOS( SIN($geoarray[0] * PI()/180 ) * SIN(SUBSTRING_INDEX($field, ',',1) * PI()/180 ) + COS($geoarray[0] * PI()/180 ) * COS(SUBSTRING_INDEX($field, ',',1) * PI()/180 ) * COS(($geoarray[1] - SUBSTRING_INDEX($field, ',',-1)) * PI()/180))*180/PI())*60*1.1515),6)"; + $value = $this->m_distance; + } else { // LIKE only supported for strings and coordinates $comp = '='; } break; _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs