wiki:MapGuideRfc46

MapGuide RFC 46 - New Generate Filters API

This page contains a change request (RFC) for the MapGuide Open Source project. More MapGuide RFCs can be found on the RFCs page.

Status

RFC Template Version(1.0)
Submission Date(Date/Time? submitted)
Last Modified(your name here) Timestamp?
AuthorRonnie Louie
RFC Statusretracted
Implementation Statuspending
Proposed Milestone2.1
Assigned PSC guide(s)(when determined)
Voting History(vote date)
+1
+0
-0
-1

Overview

This RFC is for adding a new API for generating filters from a selection.

Motivation

The current MgSelectionBase::GenerateFilter() API returns a string representing a filter for a set of selected features.

 STRING MgSelectionBase::GenerateFilter(MgLayerBase* layer, CREFSTRING className);

This filter string would look something like: "FeatId = 1109 OR FeatId = 1130 OR FeatId = 2065" such that each of the IDs of the selected features is explicitly specified. The string is then passed as the filter to MgFeatureService::SelectFeatures() to query the datastore.

A selection can contain an unlimited number of features, which means that the filter will contain an unlimited number of OR conditions. However, most datastores have a finite number of OR's that can be supported, and some data sources, such as Access databases, are limited to a relatively small number or OR conditions.

Results can be unpredictable when the limit is exceeded due to buffer overruns and/or memory corruption leading to instability in the MapGuide Server. In an effort to improve stability, GenerateFilter() was modified to return a string representing a smaller, but incomplete subset of the total selected features.

Proposed Solution

Exposing a new API to return a collection of smaller filters for a set of selected features will allow for querying of the datastore without compromising Server stability.

Proposed New API:

 MgStringCollection* MgSelectionBase::GenerateFilters(MgLayerBase* layer, CREFSTRING className, INT32 selectionSize);

The selectionSize parameter specifies the maximum size for each of the individual filters in the collection. For example, if selectionSize = 20, the maximum number of features represented by an individual filter is 20. The collection could contain an unlimited number of filters to handle an unlimited number of features.

Implications

Code that currently calls MgSelectionBase::GenerateFilter() should be updated to use MgSelectionBase::GenerateFilters() instead, and the caller will be required to process all the filters in the collection to correctly query the complete selection set.

PHP code example using existing MgSelectionBase::GenerateFilter() API

            $filter = $sel->GenerateFilter($selLayer, $featureClassName);
            
            $query = new MgFeatureQueryOptions();
            $query->SetFilter($filter);
 
            $featureSource = new MgResourceIdentifier($selLayer->GetFeatureSourceId());
            $features = $featureSrvc->SelectFeatures($featureSource, $featureClassName, $query);
            if($features->ReadNext())
            {
                do
                {
                    AddFeatureToCollection($features->GetGeometry());
                }
                while($features->ReadNext());
                $features->Close();
            }

PHP code example using NEW MgSelectionBase::GenerateFilters() API

            $filterCollection = $sel->GenerateFilters($selLayer, $featureClassName, GetMaxSelectionSize());
            
            for ($filterIndex = 0; $filterIndex < $filterCollection->GetCount(); $filterIndex++)
            {
                $query = new MgFeatureQueryOptions();
                $query->SetFilter($filterCollection->GetItem($filterIndex));
 
                $featureSource = new MgResourceIdentifier($selLayer->GetFeatureSourceId());
                $features = $featureSrvc->SelectFeatures($featureSource, $featureClassName, $query);
                if($features->ReadNext())
                {
                    do
                    {
                        AddFeatureToCollection($features->GetGeometry());
                    }
                    while($features->ReadNext());
                    $features->Close();
                }
            }

The old GenerateFilter() API should be deprecated. In places where a relatively small number of features are expected in a selection (i.e. less than the value specified by SelectionFilterSize in serverconfig.ini/webconfig.ini), MgSelectionBase::GenerateFilter() may still be safely used to return correct results.

This is a new API which will need to be documented.

Test Plan

Test existing APIs to ensure functionality does not change. Test NEW APIs functionality.

Funding/Resources?

Autodesk to supply

Last modified 9 years ago Last modified on Jul 9, 2008 2:57:03 PM