Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
More improvements to filter conversion
  • Loading branch information
nyalldawson committed Sep 6, 2020
1 parent 2fa8cf3 commit b5ff62a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
8 changes: 4 additions & 4 deletions src/core/vectortile/qgsmapboxglstyleconverter.cpp
Expand Up @@ -1258,8 +1258,9 @@ QString QgsMapBoxGlStyleConverter::parseExpression( const QVariantList &expressi
else if ( op == QLatin1String( "match" ) )
{
const QString attribute = expression.value( 1 ).toList().value( 1 ).toString();

QString caseString = QStringLiteral( "CASE " );
for ( int i = 2; i < expression.size() - 2; ++i )
for ( int i = 2; i < expression.size() - 2; i += 2 )
{
if ( expression.at( i ).type() == QVariant::List || expression.at( i ).type() == QVariant::StringList )
{
Expand All @@ -1280,10 +1281,9 @@ QString QgsMapBoxGlStyleConverter::parseExpression( const QVariantList &expressi
caseString += QStringLiteral( "WHEN (%1) " ).arg( QgsExpression::createFieldEqualityExpression( attribute, expression.at( i ) ) );
}

caseString += QStringLiteral( "THEN %1 " ).arg( expression.at( i + 1 ).toString() );
i += 2;
caseString += QStringLiteral( "THEN %1 " ).arg( QgsExpression::quotedValue( expression.at( i + 1 ) ) );
}
caseString += QStringLiteral( " ELSE %1 END" ).arg( expression.last().toString() );
caseString += QStringLiteral( "ELSE %1 END" ).arg( QgsExpression::quotedValue( expression.last() ) );
return caseString;
}
else
Expand Down
21 changes: 16 additions & 5 deletions tests/src/python/test_qgsmapboxglconverter.py
Expand Up @@ -139,33 +139,44 @@ def testParseExpression(self):
["==", ["get", "level"], 0],
["match", ["get", "type"], ["Restricted"], True, False]
], conversion_context),
'''(level IS 0) AND (CASE WHEN "type" = 'Restricted' THEN true ELSE false END)''')
'''(level IS 0) AND (CASE WHEN "type" = 'Restricted' THEN TRUE ELSE FALSE END)''')

self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression([
"match", ["get", "type"], ["Restricted"], True, False
], conversion_context),
'''CASE WHEN "type" = 'Restricted' THEN TRUE ELSE FALSE END''')

self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression([
"match", ["get", "type"], ["Restricted"], "r", ["Local"], "l", ["Secondary", "Main"], "m", "n"
], conversion_context),
'''CASE WHEN "type" = 'Restricted' THEN 'r' WHEN "type" = 'Local' THEN 'l' WHEN "type" IN ('Secondary', 'Main') THEN 'm' ELSE 'n' END''')

self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression([
"all",
["==", ["get", "level"], 0],
["match", ["get", "type"], ["Restricted", "Temporary"], True, False]
], conversion_context),
'''(level IS 0) AND (CASE WHEN "type" IN ('Restricted', 'Temporary') THEN true ELSE false END)''')
'''(level IS 0) AND (CASE WHEN "type" IN ('Restricted', 'Temporary') THEN TRUE ELSE FALSE END)''')
self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression([
"any",
["match", ["get", "level"], [1], True, False],
["match", ["get", "type"], ["Local"], True, False]
], conversion_context),
'''(CASE WHEN "level" = 1 THEN true ELSE false END) OR (CASE WHEN "type" = 'Local' THEN true ELSE false END)''')
'''(CASE WHEN "level" = 1 THEN TRUE ELSE FALSE END) OR (CASE WHEN "type" = 'Local' THEN TRUE ELSE FALSE END)''')
self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression([
"none",
["match", ["get", "level"], [1], True, False],
["match", ["get", "type"], ["Local"], True, False]
], conversion_context),
'''NOT (CASE WHEN "level" = 1 THEN true ELSE false END) AND NOT (CASE WHEN "type" = 'Local' THEN true ELSE false END)''')
'''NOT (CASE WHEN "level" = 1 THEN TRUE ELSE FALSE END) AND NOT (CASE WHEN "type" = 'Local' THEN TRUE ELSE FALSE END)''')
self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression([
"match",
["get", "type"],
["Primary", "Motorway"],
False,
True
], conversion_context),
'''CASE WHEN "type" IN ('Primary', 'Motorway') THEN false ELSE true END''')
'''CASE WHEN "type" IN ('Primary', 'Motorway') THEN FALSE ELSE TRUE END''')
self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression(["==", "_symbol", 0], conversion_context),
'''"_symbol" IS 0''')

Expand Down

0 comments on commit b5ff62a

Please sign in to comment.