?? ogrfeaturequery.cpp
字號:
else
{
return EQUAL(psField->String,op->string_value);
}
case SWQ_NE:
if (psField->Set.nMarker1 == OGRUnsetMarker
&& psField->Set.nMarker2 == OGRUnsetMarker )
{
return (op->string_value[0] != '\0');
}
else
{
return !EQUAL(psField->String,op->string_value);
}
case SWQ_LT:
if (psField->Set.nMarker1 == OGRUnsetMarker
&& psField->Set.nMarker2 == OGRUnsetMarker )
{
return (op->string_value[0] != '\0');
}
else
{
return strcmp(psField->String,op->string_value) < 0;
}
case SWQ_GT:
if (psField->Set.nMarker1 == OGRUnsetMarker
&& psField->Set.nMarker2 == OGRUnsetMarker )
{
return (op->string_value[0] != '\0');
}
else
{
return strcmp(psField->String,op->string_value) > 0;
}
case SWQ_LE:
if (psField->Set.nMarker1 == OGRUnsetMarker
&& psField->Set.nMarker2 == OGRUnsetMarker )
{
return (op->string_value[0] != '\0');
}
else
{
return strcmp(psField->String,op->string_value) <= 0;
}
case SWQ_GE:
if (psField->Set.nMarker1 == OGRUnsetMarker
&& psField->Set.nMarker2 == OGRUnsetMarker )
{
return (op->string_value[0] != '\0');
}
else
{
return strcmp(psField->String,op->string_value) >= 0;
}
case SWQ_ISNULL:
return !poFeature->IsFieldSet( op->field_index );
case SWQ_LIKE:
if (psField->Set.nMarker1 != OGRUnsetMarker
|| psField->Set.nMarker2 != OGRUnsetMarker )
return swq_test_like(psField->String, op->string_value);
else
return FALSE;
case SWQ_IN:
{
const char *pszSrc;
if( !poFeature->IsFieldSet(op->field_index) )
return FALSE;
pszSrc = op->string_value;
while( *pszSrc != '\0' )
{
if( EQUAL(pszSrc,psField->String) )
return TRUE;
pszSrc += strlen(pszSrc) + 1;
}
return FALSE;
}
default:
CPLDebug( "OGRFeatureQuery",
"Illegal operation (%d) on string field.",
op->operation );
return FALSE;
}
case SWQ_OTHER:
switch( op->operation )
{
case SWQ_ISNULL:
return !poFeature->IsFieldSet( op->field_index );
default:
CPLDebug( "OGRFeatureQuery",
"Illegal operation (%d) on list or binary field.",
op->operation );
return FALSE;
}
default:
assert( FALSE );
return FALSE;
}
}
/************************************************************************/
/* Evaluate() */
/************************************************************************/
int OGRFeatureQuery::Evaluate( OGRFeature *poFeature )
{
if( pSWQExpr == NULL )
return FALSE;
return swq_expr_evaluate( (swq_expr *) pSWQExpr,
(swq_op_evaluator) OGRFeatureQueryEvaluator,
(void *) poFeature );
}
/************************************************************************/
/* EvaluateAgainstIndices() */
/* */
/* Attempt to return a list of FIDs matching the given */
/* attribute query conditions utilizing attribute indices. */
/* Returns NULL if the result cannot be computed from the */
/* available indices, or an "OGRNullFID" terminated list of */
/* FIDs if it can. */
/* */
/* For now we only support equality tests on a single indexed */
/* attribute field. Eventually we should make this support */
/* multi-part queries with ranges. */
/************************************************************************/
long *OGRFeatureQuery::EvaluateAgainstIndices( OGRLayer *poLayer,
OGRErr *peErr )
{
swq_expr *psExpr = (swq_expr *) pSWQExpr;
OGRAttrIndex *poIndex;
if( peErr != NULL )
*peErr = OGRERR_NONE;
/* -------------------------------------------------------------------- */
/* Does the expression meet our requirements? Do we have an */
/* index on the targetted field? */
/* -------------------------------------------------------------------- */
if( psExpr == NULL || psExpr->operation != SWQ_EQ
|| poLayer->GetIndex() == NULL )
return NULL;
poIndex = poLayer->GetIndex()->GetFieldIndex( psExpr->field_index );
if( poIndex == NULL )
return NULL;
/* -------------------------------------------------------------------- */
/* OK, we have an index, now we need to query it. */
/* -------------------------------------------------------------------- */
OGRField sValue;
OGRFieldDefn *poFieldDefn;
poFieldDefn = poLayer->GetLayerDefn()->GetFieldDefn(psExpr->field_index);
switch( poFieldDefn->GetType() )
{
case OFTInteger:
sValue.Integer = psExpr->int_value;
break;
case OFTReal:
sValue.Real = psExpr->float_value;
break;
case OFTString:
sValue.String = psExpr->string_value;
break;
default:
CPLAssert( FALSE );
return NULL;
}
return poIndex->GetAllMatches( &sValue );
}
/************************************************************************/
/* OGRFieldCollector() */
/* */
/* Helper function for recursing through tree to satisfy */
/* GetUsedFields(). */
/************************************************************************/
char **OGRFeatureQuery::FieldCollector( void *pBareOp,
char **papszList )
{
swq_field_op *op = (swq_field_op *) pBareOp;
/* -------------------------------------------------------------------- */
/* References to tables other than the primarily are currently */
/* unsupported. Error out. */
/* -------------------------------------------------------------------- */
if( op->table_index != 0 )
{
CSLDestroy( papszList );
return NULL;
}
/* -------------------------------------------------------------------- */
/* Add the field name into our list if it is not already there. */
/* -------------------------------------------------------------------- */
const char *pszFieldName;
if( op->field_index >= poTargetDefn->GetFieldCount()
&& op->field_index < poTargetDefn->GetFieldCount() + SPECIAL_FIELD_COUNT)
pszFieldName = SpecialFieldNames[op->field_index];
else if( op->field_index >= 0
&& op->field_index < poTargetDefn->GetFieldCount() )
pszFieldName =
poTargetDefn->GetFieldDefn(op->field_index)->GetNameRef();
else
{
CSLDestroy( papszList );
return NULL;
}
if( CSLFindString( papszList, pszFieldName ) == -1 )
papszList = CSLAddString( papszList, pszFieldName );
/* -------------------------------------------------------------------- */
/* Add in fields from subexpressions. */
/* -------------------------------------------------------------------- */
if( op->first_sub_expr != NULL )
papszList = FieldCollector( op->first_sub_expr, papszList );
if( op->second_sub_expr != NULL )
papszList = FieldCollector( op->second_sub_expr, papszList );
return papszList;
}
/************************************************************************/
/* GetUsedFields() */
/************************************************************************/
/**
* Returns lists of fields in expression.
*
* All attribute fields are used in the expression of this feature
* query are returned as a StringList of field names. This function would
* primarily be used within drivers to recognise special case conditions
* depending only on attribute fields that can be very efficiently
* fetched.
*
* NOTE: If any fields in the expression are from tables other than the
* primary table then NULL is returned indicating an error. In succesful
* use, no non-empty expression should return an empty list.
*
* @return list of field names. Free list with CSLDestroy() when no longer
* required.
*/
char **OGRFeatureQuery::GetUsedFields( )
{
if( pSWQExpr == NULL )
return NULL;
return FieldCollector( pSWQExpr, NULL );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -