int OGRSQLiteSelectLayer::TestCapability( const char * pszCap ) { if (EQUAL(pszCap,OLCFastSpatialFilter)) { if (osSQLCurrent != osSQLBase) return TRUE; size_t i = 0; OGRSQLiteLayer* poBaseLayer = GetBaseLayer(i); if (poBaseLayer == NULL) { CPLDebug("SQLITE", "Cannot find base layer"); return FALSE; } OGRPolygon oFakePoly; const char* pszWKT = "POLYGON((0 0,0 1,1 1,1 0,0 0))"; oFakePoly.importFromWkt((char**) &pszWKT); CPLString osSpatialWhere = poBaseLayer->GetSpatialWhere(&oFakePoly); return osSpatialWhere.size() != 0; } else return OGRSQLiteLayer::TestCapability( pszCap ); }
int OGRSQLiteSelectLayer::RebuildSQLWithSpatialClause() { osSQLCurrent = osSQLBase; if (m_poFilterGeom == NULL) { return TRUE; } size_t i = 0; OGRSQLiteLayer* poBaseLayer = GetBaseLayer(i); if (poBaseLayer == NULL) { CPLDebug("SQLITE", "Cannot find base layer"); return FALSE; } CPLString osSpatialWhere = poBaseLayer->GetSpatialWhere(m_poFilterGeom); if (osSpatialWhere.size() == 0) { CPLDebug("SQLITE", "Cannot get spatial where clause"); return FALSE; } while (i < osSQLBase.size() && osSQLBase[i] == ' ') i ++; if (i < osSQLBase.size() && EQUALN(osSQLBase.c_str() + i, "WHERE ", 6)) { osSQLCurrent = osSQLBase.substr(0, i + 6); osSQLCurrent += osSpatialWhere; osSQLCurrent += " AND ("; size_t nEndOfWhere = osSQLBase.ifind(" GROUP "); if (nEndOfWhere == std::string::npos) nEndOfWhere = osSQLBase.ifind(" ORDER "); if (nEndOfWhere == std::string::npos) nEndOfWhere = osSQLBase.ifind(" LIMIT "); if (nEndOfWhere == std::string::npos) { osSQLCurrent += osSQLBase.substr(i + 6); osSQLCurrent += ")"; } else { osSQLCurrent += osSQLBase.substr(i + 6, nEndOfWhere - (i + 6)); osSQLCurrent += ")"; osSQLCurrent += osSQLBase.substr(nEndOfWhere); } } else if (i < osSQLBase.size() && (EQUALN(osSQLBase.c_str() + i, "GROUP ", 6) || EQUALN(osSQLBase.c_str() + i, "ORDER ", 6) || EQUALN(osSQLBase.c_str() + i, "LIMIT ", 6))) { osSQLCurrent = osSQLBase.substr(0, i); osSQLCurrent += " WHERE "; osSQLCurrent += osSpatialWhere; osSQLCurrent += " "; osSQLCurrent += osSQLBase.substr(i); } else if (i == osSQLBase.size()) { osSQLCurrent = osSQLBase.substr(0, i); osSQLCurrent += " WHERE "; osSQLCurrent += osSpatialWhere; } else { CPLDebug("SQLITE", "SQL expression too complex for the driver to insert spatial filter in it"); return FALSE; } return TRUE; }