Question on queryByAttributes - multiple fields

Sean Gillies sgillies at FRII.COM
Tue Nov 30 07:27:40 PST 2004


My responses inline ...

On Nov 29, 2004, at 6:15 PM, Cord Thomas wrote:

> Hey Sean
>
> Thank you for this definitive answer.  I have a few observations:
>
> 1 - as i said, if i see the query dump from mapserver when i forgot to
> give my account select permissions, i saw the following statement:
>
> DECLARE mycursor BINARY CURSOR FOR SELECT
> stateid,name::
> text,asbinary(force_collection(force_2d(wkb_geometry)),'NDR'),OID::
> text
> from incorpbound WHERE (stateid='ME' and name='Camden') and
> (wkb_geometry
> && setSRID( 'BOX3D(-125 23,-66
> 50.5)'::BOX3D,find_srid('','incorpbound','wkb_geometry') ))
>
> this would imply mapserver is correctly parsing my query - AND - if i
> try
> to execute this query against postgresql, it does return results - i
> get
> all excited by this.
>
> 2 - since query parsing is not left to mapserver (we have to provide
> the
> exact syntax) - there is no reason MS couldnt handle multiple field
> criteria.
>

I looked again at the code underneath mapserver queries.  Here's what
goes on under the hood: the queried layer has its 'filteritem'
temporarily
set to the 'qitem' from the query method, and its 'filter' temporarily
set to the 'qstring'.  Then the features are filtered and indexes to the
features become the query result set.

So yes, you can do a multi-attribute query.  For a RDBMS data source,
your qstring can be almost any SQL where clause, and for shapefile or
OGR sources you can do complicated mapserver expressions like

    qstring = "([att1] > 0 and [att2] > 0)"

I guess my querying HOWTO needs major revision already :)

> 3 - i see no performance issues or other technical hurdles that would
> prevent the execution by MS of this request - unless actually it is
> tied
> to how this information gets back into the TEMPLATE object or is used
> by
> LABELs - both issues i am unclear on (like why a TEMPLATE is
> /required/ by
> MS for queries)
>

The template is an artifact from the CGI mode, since that's how the
results are delivered.  I'm constantly debating with other developers
over eliminating this artifact from mapscript.

> 4 - I understood the MS_SINGLE vs MULTIPLE - though i still need to
> learn
> how best to work with this (one problem i have is that a city's
> boundaries
> may come in more than 1 record - but i really just want 1 result -
> something i have to tinker with on my end) - thanks for the
> explanation.
>
>
> I look forward to reading more on documentation and if i can help,
> please
> let me know.  I am working on a prototype public participation web
> application and i need a feature like this to work, and work quickly
> (application performance, not how quickly i need 4.4 released).  The
> two
> fields are indexed and i really can't imagine that saving a query and
> reloading it is going to be efficient, but i look forward to possibly
> hearing from Adam.  As an alternative, i could query on the most
> restrictive field and then iterate over the results until i find the
> value
> of the less restrictive field - though ugly, i guess that is an
> alternative.
>

Since your data is in PostgreSQL/PostGIS, you can always go directly
to the database when you need.

cheers,
Sean



More information about the MapServer-users mailing list