MgServerGetFeatureProviders::MgServerGetFeatureProviders() { FdoPtr<IProviderRegistry> providerReg = FdoFeatureAccessManager::GetProviderRegistry(); CHECKNULL(providerReg, L"MgServerGetFeatureProviders.MgServerGetFeatureProviders()"); FdoPtr<IConnectionManager> connManager = FdoFeatureAccessManager::GetConnectionManager(); CHECKNULL(connManager, L"MgServerGetFeatureProviders.MgServerGetFeatureProviders()"); m_fdoProviderCol = providerReg->GetProviders(); CHECKNULL(m_fdoProviderCol, L"MgServerGetFeatureProviders.MgServerGetFeatureProviders()"); // this XML follows the FeatureProviderRegistry-1.0.0.xsd schema m_xmlUtil = new MgXmlUtil("FeatureProviderRegistry" /* NOXLATE */); CHECKNULL(m_xmlUtil, L"MgServerGetFeatureProviders.MgServerGetFeatureProviders()"); // no more risk of exceptions, so we can now assign these m_providerReg = providerReg.Detach(); m_connManager = connManager.Detach(); }
MgFdoFilterCollection* MgSelectCommand::GetSubFilters() { // Break up a filter into a bunch of smaller filters // For now we just reduce a simple case with datastore limitations in handling the number of OR conditions. // This is the case where a filter has only OR spatial conditions that can be broken up into a collection // of smaller OR filters. class FdoCommonFilterFragmenter : public virtual FdoIFilterProcessor { private: FdoPtr<FdoFilter> m_newFilter; FdoPtr<FdoIGeometry> m_geomRight; FdoPtr<FdoIGeometry> m_geomLeft; int m_OrCount; std::vector<FdoFilter*> m_filters; bool m_isFragmented; protected: void HandleFilter( FdoFilter *filter ) { filter->Process( this ); } public: FdoCommonFilterFragmenter( ):m_isFragmented(true) { m_OrCount = 0; m_filters.clear(); } int GetOrCount() { return m_OrCount; } std::vector<FdoFilter*>& GetFilters() { return m_filters; } bool IsFragmented() { return m_isFragmented; } FdoFilter* GetNewFilter() { return m_newFilter ? FDO_SAFE_ADDREF(m_newFilter.p) : NULL; } virtual void Dispose() { delete this; } virtual void ProcessBinaryLogicalOperator(FdoBinaryLogicalOperator& filter) { if( filter.GetOperation() != FdoBinaryLogicalOperations_Or ) { m_isFragmented = false; return; } HandleFilter( FdoPtr<FdoFilter>(filter.GetRightOperand()) ); m_newFilter = filter.GetLeftOperand(); m_OrCount++; } virtual void ProcessComparisonCondition(FdoComparisonCondition& filter) { // Add filter to collection m_filters.push_back(&filter); return; } virtual void ProcessDistanceCondition(FdoDistanceCondition& filter) { m_isFragmented = false; return; } virtual void ProcessInCondition(FdoInCondition& filter) { m_isFragmented = false; return; } virtual void ProcessNullCondition(FdoNullCondition& filter) { m_isFragmented = false; return; } virtual void ProcessSpatialCondition(FdoSpatialCondition& filter) { m_isFragmented = false; return; } virtual void ProcessUnaryLogicalOperator(FdoUnaryLogicalOperator& filter) { m_isFragmented = false; return; } }; FdoCommonFilterFragmenter fragmenter; if (m_filter) m_filter->Process( &fragmenter ); FdoPtr<FdoFilter> newFilter = fragmenter.GetNewFilter(); while (newFilter != NULL) { newFilter->Process( &fragmenter ); FdoPtr<FdoFilter> tempFilter = fragmenter.GetNewFilter(); if (tempFilter != newFilter) { newFilter = tempFilter; } else { newFilter = NULL; } } #ifdef _DEBUG int nCount = fragmenter.GetOrCount(); if ( nCount > 0) { char temp[1024]; sprintf(temp, "Or_Count = %d", nCount); // NOXLATE printf("%s\n", temp); } #endif FdoPtr<MgFdoFilterCollection> filters = MgFdoFilterCollection::Create(); if (fragmenter.IsFragmented() && fragmenter.GetOrCount() > 0) { int nSelectionCount = 0; std::vector<FdoFilter*>::iterator filterIter; bool bFirst = true; FdoStringP filterString; std::vector<FdoFilter*>& fragmentedFilters = fragmenter.GetFilters(); bool bIsAddedToCollection = false; for (filterIter = fragmentedFilters.begin(); filterIter != fragmentedFilters.end(); filterIter++) { FdoStringP tempString = (*filterIter)->ToString(); FdoStringP orString = L" OR "; // NOXLATE if (bFirst) { filterString = tempString; bFirst = false; } else { filterString = filterString + orString + tempString; nSelectionCount++; } if (nSelectionCount >= MG_MAX_SUBFILTER_SIZE) { FdoPtr<FdoFilter> filter = FdoFilter::Parse(filterString); filters->Add(filter); bFirst = true; filterString = L""; nSelectionCount = 0; bIsAddedToCollection = true; } else { bIsAddedToCollection = false; } } if ( !bIsAddedToCollection ) { FdoPtr<FdoFilter> filter = FdoFilter::Parse(filterString); filters->Add(filter); } } else { filters->Add(m_filter); } return filters.Detach(); }