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

Reply via email to