.. index::
   pair: MapScript; Querying

.. _querying:

*****************************************************************************
 Querying
*****************************************************************************

:Author: Sean Gillies

.. contents::
    :depth: 2
    :backlinks: top



Introduction
============

All examples in this document refer to the mapfile and testing layers
distributed with MapServer 4.2+ and found under mapserver/tests.

Pseudocode
----------

All examples will use a pseudocode that is consistent with the language
independent API reference.  Each line is a statement. For object attributes
and methods we use the dot, '.', operator.  Creation and deletion of objects
will be indicated by 'new' and 'del' keywords.  Other than that, the 
pseudocode looks a lot like Python.

Querying Overview
=================

The Query Result Set
--------------------

Map layers can be queried to select features using spatial query methods
or the attribute query method.  Ignoring for the moment whether we are 
executing a spatial or attribute query, results are obtained like so::

    layer.query()                                 # not an actual method!
    results = layer.getResults()

In the case of a failed query or query with zero results, 'getResults'
returns NULL.

Result Set Members
------------------

Individual members of the query results are obtained like::

    ...                                           # continued
    
    if results:
        for i in range(results.numresults):       # iterate over results
            result = results.getResult(i)

This result object is a handle, of sorts, for a feature of the layer,
having 'shapeindex' and 'tileindex' attributes that can be used as
arguments to 'getFeature'.

Resulting Features
-------------------

The previous example code can now be extended to the case of obtaining all
queried features::

    layer.query()
    results = layer.getResults()
    if results:
        # open layer in preparation of reading shapes
        layer.open()

        for i in range(results.numresults):
            result = results.getResult(i)
            
            layer.getFeature(result)
            
            ...  # do something with this feature

        # Close when done
        layer.close()

Backwards Compatibility
-----------------------

The API changed substantially with version 6.0 and backward compatibility was broken.
Scripts will have to be updated to work
with the new API.


Attribute Queries
=================

By Attributes
-------------

queryByAttributes()

Spatial Queries
===============

By Rectangle
------------

queryByRect()

By Point
--------

queryByRect()

By Shape
--------

queryByShape()

By Selection
------------

queryByFeatures()



