mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
[FEATURE] Add "starts with" and "ends with" to multi attribute search
This commit is contained in:
parent
655f121af5
commit
8efa9fa815
@ -90,6 +90,8 @@ class QgsSearchWidgetWrapper : QgsWidgetWrapper
|
|||||||
IsNull,
|
IsNull,
|
||||||
IsNotBetween,
|
IsNotBetween,
|
||||||
IsNotNull,
|
IsNotNull,
|
||||||
|
StartsWith,
|
||||||
|
EndsWith,
|
||||||
};
|
};
|
||||||
typedef QFlags<QgsSearchWidgetWrapper::FilterFlag> FilterFlags;
|
typedef QFlags<QgsSearchWidgetWrapper::FilterFlag> FilterFlags;
|
||||||
|
|
||||||
|
@ -34,7 +34,9 @@ QList<QgsSearchWidgetWrapper::FilterFlag> QgsSearchWidgetWrapper::exclusiveFilte
|
|||||||
<< Contains
|
<< Contains
|
||||||
<< DoesNotContain
|
<< DoesNotContain
|
||||||
<< IsNull
|
<< IsNull
|
||||||
<< IsNotNull;
|
<< IsNotNull
|
||||||
|
<< StartsWith
|
||||||
|
<< EndsWith;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QgsSearchWidgetWrapper::FilterFlag> QgsSearchWidgetWrapper::nonExclusiveFilterFlags()
|
QList<QgsSearchWidgetWrapper::FilterFlag> QgsSearchWidgetWrapper::nonExclusiveFilterFlags()
|
||||||
@ -73,7 +75,10 @@ QString QgsSearchWidgetWrapper::toString( QgsSearchWidgetWrapper::FilterFlag fla
|
|||||||
return QObject::tr( "Is missing (null)" );
|
return QObject::tr( "Is missing (null)" );
|
||||||
case IsNotNull:
|
case IsNotNull:
|
||||||
return QObject::tr( "Is not missing (not null)" );
|
return QObject::tr( "Is not missing (not null)" );
|
||||||
|
case StartsWith:
|
||||||
|
return QObject::tr( "Starts with" );
|
||||||
|
case EndsWith:
|
||||||
|
return QObject::tr( "Ends with" );
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,8 @@ class GUI_EXPORT QgsSearchWidgetWrapper : public QgsWidgetWrapper
|
|||||||
IsNull = 1 << 11, //!< Supports searching for null values
|
IsNull = 1 << 11, //!< Supports searching for null values
|
||||||
IsNotBetween = 1 << 12, //!< Supports searching for values outside of a set range
|
IsNotBetween = 1 << 12, //!< Supports searching for values outside of a set range
|
||||||
IsNotNull = 1 << 13, //!< Supports searching for non-null values
|
IsNotNull = 1 << 13, //!< Supports searching for non-null values
|
||||||
|
StartsWith = 1 << 14, //!< Supports searching for strings that start with
|
||||||
|
EndsWith = 1 << 15, //!< Supports searching for strings that end with
|
||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS( FilterFlags, FilterFlag )
|
Q_DECLARE_FLAGS( FilterFlags, FilterFlag )
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ QgsSearchWidgetWrapper::FilterFlags QgsDefaultSearchWidgetWrapper::supportedFlag
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case QVariant::String:
|
case QVariant::String:
|
||||||
flags |= Contains | DoesNotContain;
|
flags |= Contains | DoesNotContain | StartsWith | EndsWith;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -213,15 +213,21 @@ QString QgsDefaultSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper:
|
|||||||
+ ( flags & EqualTo ? "=" : "<>" ) +
|
+ ( flags & EqualTo ? "=" : "<>" ) +
|
||||||
QStringLiteral( "lower(%1)" ).arg( QgsExpression::quotedString( mLineEdit->text() ) );
|
QStringLiteral( "lower(%1)" ).arg( QgsExpression::quotedString( mLineEdit->text() ) );
|
||||||
}
|
}
|
||||||
else if ( flags & Contains || flags & DoesNotContain )
|
else if ( flags & Contains || flags & DoesNotContain || flags & StartsWith || flags & EndsWith )
|
||||||
{
|
{
|
||||||
QString exp = fieldName + ( mCheckbox && mCheckbox->isChecked() ? " LIKE " : " ILIKE " );
|
QString exp = fieldName + ( mCheckbox && mCheckbox->isChecked() ? " LIKE " : " ILIKE " );
|
||||||
QString value = QgsExpression::quotedString( mLineEdit->text() );
|
QString value = QgsExpression::quotedString( mLineEdit->text() );
|
||||||
value.chop( 1 );
|
value.chop( 1 );
|
||||||
value = value.remove( 0, 1 );
|
value = value.remove( 0, 1 );
|
||||||
exp += "'%" + value + "%'";
|
exp += '\'';
|
||||||
|
if ( !flags.testFlag( StartsWith ) )
|
||||||
|
exp += '%';
|
||||||
|
exp += value;
|
||||||
|
if ( !flags.testFlag( EndsWith ) )
|
||||||
|
exp += '%';
|
||||||
|
exp += '\'';
|
||||||
if ( flags & DoesNotContain )
|
if ( flags & DoesNotContain )
|
||||||
exp.prepend( "NOT (" ).append( ")" );
|
exp.prepend( "NOT (" ).append( ')' );
|
||||||
return exp;
|
return exp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,9 +87,13 @@ class PyQgsDefaultSearchWidgetWrapper(unittest.TestCase):
|
|||||||
case_sensitive.setChecked(False)
|
case_sensitive.setChecked(False)
|
||||||
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.Contains), '"fldtxt" ILIKE \'%test%\'')
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.Contains), '"fldtxt" ILIKE \'%test%\'')
|
||||||
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.DoesNotContain), 'NOT ("fldtxt" ILIKE \'%test%\')')
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.DoesNotContain), 'NOT ("fldtxt" ILIKE \'%test%\')')
|
||||||
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.StartsWith), '"fldtxt" ILIKE \'test%\'')
|
||||||
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.EndsWith), '"fldtxt" ILIKE \'%test\'')
|
||||||
case_sensitive.setChecked(True)
|
case_sensitive.setChecked(True)
|
||||||
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.Contains), '"fldtxt" LIKE \'%test%\'')
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.Contains), '"fldtxt" LIKE \'%test%\'')
|
||||||
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.DoesNotContain), 'NOT ("fldtxt" LIKE \'%test%\')')
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.DoesNotContain), 'NOT ("fldtxt" LIKE \'%test%\')')
|
||||||
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.StartsWith), '"fldtxt" LIKE \'test%\'')
|
||||||
|
self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.EndsWith), '"fldtxt" LIKE \'%test\'')
|
||||||
case_sensitive.setChecked(False)
|
case_sensitive.setChecked(False)
|
||||||
|
|
||||||
# numeric field
|
# numeric field
|
||||||
|
Loading…
x
Reference in New Issue
Block a user