CPLString WFS_TurnSQLFilterToOGCFilter( const swq_expr_node* poExpr, OGRDataSource* poDS, OGRFeatureDefn* poFDefn, int nVersion, int bPropertyIsNotEqualToSupported, int bUseFeatureId, int bGmlObjectIdNeedsGMLPrefix, const char* pszNSPrefix, int* pbOutNeedsNullCheck ) { CPLString osFilter; /* If the filter is only made of querying one or several gml_id */ /* (with OR operator), we turn this to <GmlObjectId> list */ if (!WFS_ExprDumpGmlObjectIdFilter(osFilter, poExpr, bUseFeatureId, bGmlObjectIdNeedsGMLPrefix, nVersion)) { ExprDumpFilterOptions sOptions; sOptions.nVersion = nVersion; sOptions.bPropertyIsNotEqualToSupported = bPropertyIsNotEqualToSupported; sOptions.bOutNeedsNullCheck = FALSE; sOptions.poDS = poDS; sOptions.poFDefn = poFDefn; sOptions.nUniqueGeomGMLId = 1; sOptions.poSRS = NULL; sOptions.pszNSPrefix = pszNSPrefix; osFilter = ""; if (!WFS_ExprDumpAsOGCFilter(osFilter, poExpr, TRUE, &sOptions)) osFilter = ""; /*else CPLDebug("WFS", "Filter %s", osFilter.c_str());*/ *pbOutNeedsNullCheck = sOptions.bOutNeedsNullCheck; } return osFilter; }
static int WFS_ExprDumpGmlObjectIdFilter(CPLString& osFilter, const swq_expr_node* poExpr, int bUseFeatureId, int bGmlObjectIdNeedsGMLPrefix, int nVersion) { if (poExpr->eNodeType == SNT_OPERATION && poExpr->nOperation == SWQ_EQ && poExpr->nSubExprCount == 2 && poExpr->papoSubExpr[0]->eNodeType == SNT_COLUMN && strcmp(poExpr->papoSubExpr[0]->string_value, "gml_id") == 0 && poExpr->papoSubExpr[1]->eNodeType == SNT_CONSTANT) { if (bUseFeatureId) osFilter += "<FeatureId fid=\""; else if (nVersion >= 200) osFilter += "<ResourceId rid=\""; else if (!bGmlObjectIdNeedsGMLPrefix) osFilter += "<GmlObjectId id=\""; else osFilter += "<GmlObjectId gml:id=\""; if( poExpr->papoSubExpr[1]->field_type == SWQ_INTEGER || poExpr->papoSubExpr[1]->field_type == SWQ_INTEGER64 ) osFilter += CPLSPrintf(CPL_FRMT_GIB, poExpr->papoSubExpr[1]->int_value); else if( poExpr->papoSubExpr[1]->field_type == SWQ_STRING ) { char* pszXML = CPLEscapeString(poExpr->papoSubExpr[1]->string_value, -1, CPLES_XML); osFilter += pszXML; CPLFree(pszXML); } else return FALSE; osFilter += "\"/>"; return TRUE; } else if (poExpr->eNodeType == SNT_OPERATION && poExpr->nOperation == SWQ_OR && poExpr->nSubExprCount == 2 ) { return WFS_ExprDumpGmlObjectIdFilter(osFilter, poExpr->papoSubExpr[0], bUseFeatureId, bGmlObjectIdNeedsGMLPrefix, nVersion) && WFS_ExprDumpGmlObjectIdFilter(osFilter, poExpr->papoSubExpr[1], bUseFeatureId, bGmlObjectIdNeedsGMLPrefix, nVersion); } return FALSE; }
static int WFS_ExprDumpGmlObjectIdFilter(CPLString& osFilter, const Expr* expr, int bUseFeatureId, int bGmlObjectIdNeedsGMLPrefix, int nVersion) { if (expr->eType == TOKEN_EQUAL && expr->expr1->eType == TOKEN_VAR_NAME && EQUAL(expr->expr1->pszVal, "gml_id") && expr->expr2->eType == TOKEN_LITERAL) { if (bUseFeatureId) osFilter += "<FeatureId fid=\""; else if (nVersion >= 200) osFilter += "<ResourceId rid=\""; else if (!bGmlObjectIdNeedsGMLPrefix) osFilter += "<GmlObjectId id=\""; else osFilter += "<GmlObjectId gml:id=\""; if (expr->expr2->pszVal[0] == '\'' || expr->expr2->pszVal[0] == '"') { CPLString osVal(expr->expr2->pszVal + 1); osVal.resize(osVal.size() - 1); osFilter += osVal; } else osFilter += expr->expr2->pszVal; osFilter += "\"/>"; return TRUE; } else if (expr->eType == TOKEN_OR) { return WFS_ExprDumpGmlObjectIdFilter(osFilter, expr->expr1, bUseFeatureId, bGmlObjectIdNeedsGMLPrefix, nVersion) && WFS_ExprDumpGmlObjectIdFilter(osFilter, expr->expr2, bUseFeatureId, bGmlObjectIdNeedsGMLPrefix, nVersion); } return FALSE; }
CPLString WFS_TurnSQLFilterToOGCFilter( const char * pszFilter, OGRFeatureDefn* poFDefn, int nVersion, int bPropertyIsNotEqualToSupported, int bUseFeatureId, int bGmlObjectIdNeedsGMLPrefix, int* pbOutNeedsNullCheck ) { char** papszTokens = WFS_ExprTokenize(pszFilter); if (papszTokens == NULL) return ""; char** papszTokens2 = papszTokens; ExprBuildContext sBuildContext; sBuildContext.bExpectVarName = TRUE; sBuildContext.bExpectComparisonOperator = FALSE; sBuildContext.bExpectLogicalOperator = FALSE; sBuildContext.bExpectValue = FALSE; sBuildContext.nParenthesisLevel = 0; Expr* expr = WFS_ExprBuildInternal(&papszTokens2, &sBuildContext); CSLDestroy(papszTokens); if (expr == NULL) return ""; CPLString osFilter; /* If the filter is only made of querying one or several gml_id */ /* (with OR operator), we turn this to <GmlObjectId> list */ if (!WFS_ExprDumpGmlObjectIdFilter(osFilter, expr, bUseFeatureId, bGmlObjectIdNeedsGMLPrefix, nVersion)) { ExprDumpFilterOptions sOptions; sOptions.nVersion = nVersion; sOptions.bPropertyIsNotEqualToSupported = bPropertyIsNotEqualToSupported; sOptions.bOutNeedsNullCheck = FALSE; sOptions.poFDefn = poFDefn; osFilter = ""; if (!WFS_ExprDumpAsOGCFilter(osFilter, expr, TRUE, &sOptions)) osFilter = ""; *pbOutNeedsNullCheck = sOptions.bOutNeedsNullCheck; } WFS_ExprFree(expr); return osFilter; }