[mapserver-users] Unexpected behavior of wfs layer using postgis
Luigi Castro Cardeles
luigi.cardeles at gmail.com
Fri Aug 7 14:16:18 PDT 2009
Thanks Paul :D,
is there any ticket already open about that modification?
best regards,
Luigi Castro Cardeles
2009/8/7 Paul Ramsey <pramsey at cleverelephant.ca>
> It's not a bug, it's a feature!
>
> What you are seeing is the mapserver query life cycle. It is designed
> to be run on top of shape files, so when used on databases, it is very
> redundant. First it gathers the id's of all the features that match
> the criteria. Then it goes back and iterates through, getting each
> feature one at a time.
>
> The upcoming 5.6 release of mapserver will replace this query life
> cycle with one that is much more efficient for databases.
>
> P.
>
> On Fri, Aug 7, 2009 at 4:52 AM, Luigi Castro
> Cardeles<luigi.cardeles at gmail.com> wrote:
> > Hi list,
> >
> > I have a wfs layer (data stored at postgis) and that layer have a complex
> > data statement
> >
> > mapfile
> > -----------xxxxxxxxxxxx-------
> > LISTCOIID - cgi param
> > ##################
> > #LAYER WFS PARCEL
> > ##################
> > LAYER
> > NAME 'parcels'
> > #DEBUG 5
> > METADATA
> > "wfs_title" "parcels"
> > "wfs_request_method" "get"
> > "wfs_service" "wfs"
> > "gml_featureid" "id"
> > "gml_include_items" "all"
> > "wfs_encoding" "UTF8"
> > END
> >
> > TYPE POLYGON
> > STATUS ON
> > DUMP TRUE
> > CONNECTIONTYPE postgis
> > CONNECTION "host=localhost user='postgres' password=postgres_password
> > dbname='wfs_server'"
> > DATA "the_geom FROM (select distinct parcel.id,parcel.the_geom from
> > mapserver_parcels parcel where parcel.parcelid in( SELECT distinct
> col.id
> > FROM college col WHERE col.date_exclude IS NULL AND ((%LISTCOIID% =
> col.id)
> > OR (SELECT count(*) FROM perm_group_item pagi, visual colv , perm_group
> pag,
> > perm_acess pa WHERE pagi.date_exclude is null AND pag.date_exclude is
> null
> > AND colv.date_exclude is null AND pa.date_exclude is null AND
> > colv.perm_group_FK = pagi.perm_group_fk AND pagi.perm_group_fk = pag.idAND
> > pag.date_exclude IS NULL AND pagi.perm_acess_fk = pa.id AND pa.name =
> > 'Test1' AND colv.org_interference_fk = %LISTCOIID% AND
> > colv.org_interference_fk_fk = col.id) > 0))) as foo USING UNIQUE id
> USING
> > SRID=4326"
> > #PROCESSING "CLOSE_CONNECTION=DEFER"
> > PROJECTION
> > 'init=epsg:4326'
> > # "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
> > END
> >
> > CLASS
> > NAME 'parcels'
> > STYLE
> > SYMBOL 0
> > SIZE 10
> > OUTLINECOLOR 0 0 0
> > COLOR 150 123 90
> > END
> > END
> > END
> > ------------xxxxxxxxxxxxx----------------
> >
> > when i activated the postgres log, i notice a strange, don't expected
> > behavior. Mapserver changes the query (the data statement) and refactory
> in
> > 4(four) other queries:
> >
> > query 1:
> >
> > select
> > encode(AsBinary(force_collection(force_2d("the_geom")),'NDR'),'base64')
> as
> > geom,"id" from (select distinct parcel.id,parcel.the_geom from
> > mapserver_parcels parcel where parcel.parcelid in(SELECT distinct col.id
> > FROM college col WHERE col.date_exclude IS NULL AND ((25 = col.id) OR
> > (SELECT count(*) FROM perm_group_item pagi, visual colv , perm_group pag,
> > perm_acess pa WHERE pagi.date_exclude is null AND pag.date_exclude is
> null
> > AND colv.date_exclude is null AND pa.date_exclude is null AND
> > colv.perm_group_FK = pagi.perm_group_ AND pagi.perm_group_ = pag.id AND
> > pag.date_exclude IS NULL AND colv.perm_group_FK = pagi.perm_group_ AND
> > pagi.perm_group_ = pag.id AND pag.date_exclude IS NULL AND
> > pagi.perm_acess_fk = pa.id AND pa.name = org_interference_fk AND
> > colv.org_interference_fk = 25 AND colv.org_interference_fk_fk = col.id)
> >
> > 0))) as foo where the_geom && GeomFromText('POLYGON((-48.05 -15.77,-48.05
> > -15.71,-47.85 -15.71,-47.85 -15.77,-48.05 -15.77))',4326)
> >
> > query 2:
> >
> > select * from (select distinct parcel.id,parcel.the_geom from
> > mapserver_parcels parcel where parcel.parcelid in(SELECT distinct col.id
> > FROM college col WHERE col.date_exclude IS NULL AND ((25 = col.id) OR
> > (SELECT count(*) FROM perm_group_item pagi, visual colv , perm_group pag,
> > perm_acess pa WHERE pagi.date_exclude is null AND pag.date_exclude is
> null
> > AND colv.date_exclude is null AND pa.date_exclude is null AND
> > colv.perm_group_FK = pagi.perm_group_ AND pagi.perm_group_ = pag.id AND
> > pag.date_exclude IS NULL AND pagi.perm_acess_fk = pa.id AND pa.name =
> > org_interference_fk AND colv.org_interference_fk = 25 AND
> > colv.org_interference_fk_fk = col.id) > 0))) as foo where false limit 0
> >
> >
> > query 3:
> >
> > select
> >
> "id",encode(AsBinary(force_collection(force_2d("the_geom")),'NDR'),'base64')
> > as geom,"id" from (select distinct parcel.id,parcel.the_geom from
> > mapserver_parcels parcel where parcel.parcelid in(SELECT distinct col.id
> > FROM college col WHERE col.date_exclude IS NULL AND ((25 = col.id) OR
> > (SELECT count(*) FROM perm_group_item pagi, visual colv , perm_group pag,
> > perm_acess pa WHERE pagi.date_exclude is null AND pag.date_exclude is
> null
> > AND colv.date_exclude is null AND pa.date_exclude is null AND
> > colv.perm_group_FK = pagi.perm_group_ AND pagi.perm_group_ = pag.id AND
> > pag.date_exclude IS NULL AND pagi.perm_acess_fk = pa.id AND pa.name =
> > org_interference_fk AND colv.org_interference_fk = 25 AND
> > colv.org_interference_fk_fk = col.id) > 0))) as foo where "id" = 245
> >
> >
> > query 4:
> >
> >
> > select
> >
> "id",encode(AsBinary(force_collection(force_2d("the_geom")),'NDR'),'base64')
> > as geom,"id" from (select distinct parcel.id,parcel.the_geom from
> > mapserver_parcels parcel where parcel.parcelid in(SELECT distinct col.id
> > FROM college col WHERE col.date_exclude IS NULL AND ((25 = col.id) OR
> > (SELECT count(*) FROM perm_group_item pagi, visual colv , perm_group pag,
> > perm_acess pa WHERE pagi.date_exclude is null AND pag.date_exclude is
> null
> > AND colv.date_exclude is null AND pa.date_exclude is null AND
> > colv.perm_group_FK = pagi.perm_group_ AND pagi.perm_group_ = pag.id AND
> > pag.date_exclude IS NULL AND pagi.perm_acess_fk = pa.id AND pa.name =
> > org_interference_fk AND colv.org_interference_fk = 25 AND
> > colv.org_interference_fk_fk = col.id) > 0))) as foo where "id" = 246
> >
> > query 5
> > select
> >
> "id",encode(AsBinary(force_collection(force_2d("the_geom")),'NDR'),'base64')
> > as geom,"id" from (select distinct parcel.id,parcel.the_geom from
> > mapserver_parcels parcel where parcel.parcelid in(SELECT distinct col.id
> > FROM college col WHERE col.date_exclude IS NULL AND ((25 = col.id) OR
> > (SELECT count(*) FROM perm_group_item pagi, visual colv , perm_group pag,
> > perm_acess pa WHERE pagi.date_exclude is null AND pag.date_exclude is
> null
> > AND colv.date_exclude is null AND pa.date_exclude is null AND
> > colv.perm_group_FK = pagi.perm_group_ AND pagi.perm_group_ = pag.id AND
> > pag.date_exclude IS NULL AND pagi.perm_acess_fk = pa.id AND pa.name =
> > org_interference_fk AND colv.org_interference_fk = 25 AND
> > colv.org_interference_fk_fk = col.id) > 0))) as foo where "id" = 247
> > ------------xxxxxxxxxxxxxx----------------
> >
> > the wfs layer are returning 3 geometries (that is the expected result)
> but i
> > don't understand why mapserver is generating this four queries.
> >
> > the first query (query 1) returns the id column (pk on my table) and
> > the_geom (geometry column).
> >
> > the second query (query 2) don't return nothing.
> >
> > the third query (query 3) return the first id and the first the_geom
> values
> > (query 1 already did that).
> >
> > the forth query (query 4) return the second id and the second the_geom
> > values (query 1 already did that).
> >
> > the fifth query (query 5) return the third id and the third the_geom
> values
> > (query 1 already did that).
> >
> > -------------------------------------------
> >
> > Aproximated times:
> >
> > query 1: 3s
> > query 2: 18ms
> > query 3: 2.6s
> > query 4: 2.5s
> > query 5: 2.7s
> > ------------------------------------------
> >
> >
> > The problem with this extra-queries is that they consume time so the
> query
> > uses 8 seconds to bring back the information when should use 3 seconds to
> > brinq back information.
> >
> > This refactory of the queries made by mapserver is alright or this is a
> bug?
> >
> > Luigi Castro Cardeles
> >
> >
> > _______________________________________________
> > mapserver-users mailing list
> > mapserver-users at lists.osgeo.org
> > http://lists.osgeo.org/mailman/listinfo/mapserver-users
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/mapserver-users/attachments/20090807/740fc1e2/attachment.htm>
More information about the MapServer-users
mailing list