bool ServiceMonTask::task_start() { LOGTRACE(LOGINFO,"Enter ServiceMonTask::task_start.\n"); BuildFilter(); m_iStarttime = NS_GetTickCount(); LOGTRACE(LOGINFO,"Leave ServiceMonTask::task_start.\n"); return true ; }
OGRErr OGRPLScenesLayer::SetAttributeFilter( const char *pszQuery ) { if( pszQuery == NULL ) osQuery = ""; else osQuery = pszQuery; nFeatureCount = -1; poGeoJSONLayer = NULL; OGRErr eErr = OGRLayer::SetAttributeFilter(pszQuery); osFilterURLPart = ""; bFilterMustBeClientSideEvaluated = FALSE; if( m_poAttrQuery != NULL ) { swq_expr_node* poNode = (swq_expr_node*) m_poAttrQuery->GetSWQExpr(); poNode->ReplaceBetweenByGEAndLERecurse(); if( poNode->eNodeType == SNT_OPERATION && poNode->nOperation == SWQ_EQ && poNode->nSubExprCount == 2 && poNode->papoSubExpr[0]->eNodeType == SNT_COLUMN && poNode->papoSubExpr[0]->field_index == poFeatureDefn->GetFieldIndex("id") && poNode->papoSubExpr[1]->eNodeType == SNT_CONSTANT && poNode->papoSubExpr[1]->field_type == SWQ_STRING ) { osFilterURLPart = poNode->papoSubExpr[1]->string_value; } else { CPLString osFilter = BuildFilter(poNode); if( osFilter.size() ) { osFilterURLPart = "&"; osFilterURLPart += osFilter; } } } ResetReading(); return eErr; }
EGwsStatus CGwsPreparedFeatureQuery::Execute ( const GWSFeatureId & featid, IGWSFeatureIterator ** results ) { FdoPtr<FdoFilter> filter; EGwsStatus stat = eGwsOk; try { eGwsOkThrow (BuildFilter (featid, filter.p)); return Execute (filter, results); } catch (EGwsStatus es) { PushStatus (es); stat = es; } return stat; }
EGwsStatus CGwsPreparedFeatureQuery::Execute ( const GwsFeaturesIdVector & featids, int lBound, int uBound, IGWSFeatureIterator ** results, bool bScrollable ) { FdoPtr<FdoFilter> filter; EGwsStatus stat = eGwsOk; try { eGwsOkThrow (BuildFilter (featids, lBound, uBound, filter.p)); return Execute (filter, results, bScrollable); } catch (EGwsStatus es) { PushStatus (es); stat = es; } return stat; }
CPLString OGRPLScenesLayer::BuildFilter(swq_expr_node* poNode) { if( poNode->eNodeType == SNT_OPERATION ) { if( poNode->nOperation == SWQ_AND && poNode->nSubExprCount == 2 ) { // For AND, we can deal with a failure in one of the branch // since client-side will do that extra filtering CPLString osFilter1 = BuildFilter(poNode->papoSubExpr[0]); CPLString osFilter2 = BuildFilter(poNode->papoSubExpr[1]); if( osFilter1.size() && osFilter2.size() ) return osFilter1 + "&" + osFilter2; else if( osFilter1.size() ) return osFilter1; else return osFilter2; } else if( (poNode->nOperation == SWQ_EQ || poNode->nOperation == SWQ_NE || poNode->nOperation == SWQ_LT || poNode->nOperation == SWQ_LE || poNode->nOperation == SWQ_GT || poNode->nOperation == SWQ_GE) && poNode->nSubExprCount == 2 && poNode->papoSubExpr[0]->eNodeType == SNT_COLUMN && poNode->papoSubExpr[1]->eNodeType == SNT_CONSTANT && poNode->papoSubExpr[0]->field_index != poFeatureDefn->GetFieldIndex("id") && poNode->papoSubExpr[0]->field_index < poFeatureDefn->GetFieldCount() ) { OGRFieldDefn *poFieldDefn; poFieldDefn = poFeatureDefn->GetFieldDefn(poNode->papoSubExpr[0]->field_index); CPLString osFilter(poFieldDefn->GetNameRef()); int bDateTimeParsed = FALSE; int nYear = 0, nMonth = 0, nDay = 0, nHour = 0, nMinute = 0, nSecond = 0; if( poNode->papoSubExpr[1]->field_type == SWQ_TIMESTAMP ) { if( sscanf(poNode->papoSubExpr[1]->string_value,"%04d/%02d/%02d %02d:%02d:%02d", &nYear, &nMonth, &nDay, &nHour, &nMinute, &nSecond) >= 3 || sscanf(poNode->papoSubExpr[1]->string_value,"%04d-%02d-%02dT%02d:%02d:%02d", &nYear, &nMonth, &nDay, &nHour, &nMinute, &nSecond) >= 3 ) bDateTimeParsed = TRUE; } osFilter += "."; if( poNode->nOperation == SWQ_EQ ) { if( bDateTimeParsed ) osFilter += "gte"; else osFilter += "eq"; } else if( poNode->nOperation == SWQ_NE ) osFilter += "neq"; else if( poNode->nOperation == SWQ_LT ) osFilter += "lt"; else if( poNode->nOperation == SWQ_LE ) osFilter += "lte"; else if( poNode->nOperation == SWQ_GT ) osFilter += "gt"; else if( poNode->nOperation == SWQ_GE ) osFilter += "gte"; osFilter += "="; if (poNode->papoSubExpr[1]->field_type == SWQ_FLOAT) osFilter += CPLSPrintf("%.8f", poNode->papoSubExpr[1]->float_value); else if (poNode->papoSubExpr[1]->field_type == SWQ_INTEGER) osFilter += CPLSPrintf(CPL_FRMT_GIB, poNode->papoSubExpr[1]->int_value); else if (poNode->papoSubExpr[1]->field_type == SWQ_STRING) osFilter += poNode->papoSubExpr[1]->string_value; else if (poNode->papoSubExpr[1]->field_type == SWQ_TIMESTAMP) { if( bDateTimeParsed ) { osFilter += CPLSPrintf("%04d-%02d-%02dT%02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMinute, nSecond); if( poNode->nOperation == SWQ_EQ ) { osFilter += "&"; osFilter += poFieldDefn->GetNameRef(); osFilter += ".lt="; nSecond ++; if( nSecond == 60 ) { nSecond = 0; nMinute ++; } if( nMinute == 60 ) { nMinute = 0; nHour ++; } if( nHour == 24 ) { nHour = 0; nDay ++; } osFilter += CPLSPrintf("%04d-%02d-%02dT%02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMinute, nSecond); } } else osFilter += poNode->papoSubExpr[1]->string_value; } return osFilter; } } if( !bFilterMustBeClientSideEvaluated ) { bFilterMustBeClientSideEvaluated = TRUE; CPLDebug("PLSCENES", "Part or full filter will have to be evaluated on client side."); } return ""; }
CPLString OGRPLScenesLayer::BuildFilter(swq_expr_node* poNode) { if( poNode->eNodeType == SNT_OPERATION ) { if( poNode->nOperation == SWQ_AND && poNode->nSubExprCount == 2 ) { // For AND, we can deal with a failure in one of the branch // since client-side will do that extra filtering CPLString osFilter1 = BuildFilter(poNode->papoSubExpr[0]); CPLString osFilter2 = BuildFilter(poNode->papoSubExpr[1]); if( osFilter1.size() && osFilter2.size() ) return osFilter1 + "&" + osFilter2; else if( osFilter1.size() ) return osFilter1; else return osFilter2; } else if( (poNode->nOperation == SWQ_EQ || poNode->nOperation == SWQ_NE || poNode->nOperation == SWQ_LT || poNode->nOperation == SWQ_LE || poNode->nOperation == SWQ_GT || poNode->nOperation == SWQ_GE) && poNode->nSubExprCount == 2 && poNode->papoSubExpr[0]->eNodeType == SNT_COLUMN && poNode->papoSubExpr[1]->eNodeType == SNT_CONSTANT && poNode->papoSubExpr[0]->field_index != poFeatureDefn->GetFieldIndex("id") && poNode->papoSubExpr[0]->field_index < poFeatureDefn->GetFieldCount() ) { OGRFieldDefn *poFieldDefn = poFeatureDefn->GetFieldDefn(poNode->papoSubExpr[0]->field_index); int nOperation = poNode->nOperation; // image_quality supports only gte filters // (https://www.planet.com/docs-v0/v0/scenes/planetscope/#metadata) if( poNode->papoSubExpr[0]->field_index == poFeatureDefn->GetFieldIndex("image_statistics.image_quality") && nOperation != SWQ_GE ) { // == target can be safely turned as >= target if( poNode->nOperation == SWQ_EQ && poNode->papoSubExpr[1]->field_type == SWQ_STRING && strcmp(poNode->papoSubExpr[1]->string_value, "target") == 0 ) { nOperation = SWQ_GE; } else { if( !bFilterMustBeClientSideEvaluated ) { bFilterMustBeClientSideEvaluated = true; CPLDebug("PLSCENES", "Part or full filter will have to be " "evaluated on client side."); } return ""; } } CPLString osFilter(poFieldDefn->GetNameRef()); bool bDateTimeParsed = false; int nYear = 0; int nMonth = 0; int nDay = 0; int nHour = 0; int nMinute = 0; int nSecond = 0; if( poNode->papoSubExpr[1]->field_type == SWQ_TIMESTAMP ) { if( sscanf(poNode->papoSubExpr[1]->string_value,"%04d/%02d/%02d %02d:%02d:%02d", &nYear, &nMonth, &nDay, &nHour, &nMinute, &nSecond) >= 3 || sscanf(poNode->papoSubExpr[1]->string_value,"%04d-%02d-%02dT%02d:%02d:%02d", &nYear, &nMonth, &nDay, &nHour, &nMinute, &nSecond) >= 3 ) bDateTimeParsed = true; } osFilter += "."; if( nOperation == SWQ_EQ ) { if( bDateTimeParsed ) osFilter += "gte"; else osFilter += "eq"; } else if( nOperation == SWQ_NE ) osFilter += "neq"; else if( nOperation == SWQ_LT ) osFilter += "lt"; else if( nOperation == SWQ_LE ) osFilter += "lte"; else if( nOperation == SWQ_GT ) osFilter += "gt"; else if( nOperation == SWQ_GE ) osFilter += "gte"; osFilter += "="; if (poNode->papoSubExpr[1]->field_type == SWQ_FLOAT) osFilter += CPLSPrintf("%.8f", poNode->papoSubExpr[1]->float_value); else if (poNode->papoSubExpr[1]->field_type == SWQ_INTEGER) osFilter += CPLSPrintf(CPL_FRMT_GIB, poNode->papoSubExpr[1]->int_value); else if (poNode->papoSubExpr[1]->field_type == SWQ_STRING) osFilter += poNode->papoSubExpr[1]->string_value; else if (poNode->papoSubExpr[1]->field_type == SWQ_TIMESTAMP) { if( bDateTimeParsed ) { osFilter += CPLSPrintf("%04d-%02d-%02dT%02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMinute, nSecond); if( nOperation == SWQ_EQ ) { osFilter += "&"; osFilter += poFieldDefn->GetNameRef(); osFilter += ".lt="; nSecond ++; if( nSecond == 60 ) { nSecond = 0; nMinute ++; } if( nMinute == 60 ) { nMinute = 0; nHour ++; } if( nHour == 24 ) { nHour = 0; nDay ++; } osFilter += CPLSPrintf("%04d-%02d-%02dT%02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMinute, nSecond); } } else osFilter += poNode->papoSubExpr[1]->string_value; } return osFilter; } } if( !bFilterMustBeClientSideEvaluated ) { bFilterMustBeClientSideEvaluated = true; CPLDebug("PLSCENES", "Part or full filter will have to be evaluated on client side."); } return ""; }
bool ServiceMonTask::task_process(const U16 pid,U8 const* buffer, U32 size) { bool bRet = false; //LOGTRACE(LOGINFO, "ServiceMonTask::task_process pid %d size %d\n",pid,size); if(PAT_PID == pid) { switch(on_pat_got(buffer,size)) { case 1: // 通知PMT PID改变,更新数据库 OnEventOccur(m_stService,PMT_PID_CHANGE); // 向下执行.监测新的PMT PID case 0: if(0 != m_pTSFilter[1]){ m_pTSFilter[1]->stop_search(); delete m_pTSFilter[1]; m_pTSFilter[1] = 0; } m_bSwitchPMTMon = true; BuildFilter(); break; case -1: default: break; } } else if(SDT_PID == pid || BAT_PID == pid) //SDT,BAT { if(TableId_SdtA == buffer[0] ) { // 传递回新的DVBService,通知 频道名 改变 if(on_sdt_got(buffer,size)) OnEventOccur(m_stService,SERVICE_NAME_CHANGE); } /* else if(TableId_Bat == buffer[0]) { //通知BAT信息改变 if(on_bat_got(buffer,size)) OnEventOccur(m_stService,BAT_CHANGE); } */ } else if(pid == GetPMTId()) { if(on_pmt_got(buffer, size)) { // 传递回新的DVBService,通知新AV PID改变 OnEventOccur(m_stService,AV_PID_CHANGE); } } else if(pid == NIT_PID) { if(TableId_NitA == buffer[0] && on_nit_got(buffer, size)) { UpdateVersions(); OnEventOccur(m_stService,NIT_CHANGE); } } else if(pid == CAT_PID) { if((TableId_Cat == buffer[0]) && on_cat_got(buffer,size)) { OnEventOccur(m_stService,AV_PID_CHANGE); } } return bRet; }