@@ -120,38 +120,44 @@ class TestQgsExpression: public QObject
120
120
QgsProject::instance ()->addMapLayer ( mMemoryLayer );
121
121
122
122
// test layer for aggregates
123
- mAggregatesLayer = new QgsVectorLayer ( QStringLiteral ( " Point?field=col1:integer&field=col2:string&field=col3:integer" ), QStringLiteral ( " aggregate_layer" ), QStringLiteral ( " memory" ) );
123
+ mAggregatesLayer = new QgsVectorLayer ( QStringLiteral ( " Point?field=col1:integer&field=col2:string&field=col3:integer&field=col4:string " ), QStringLiteral ( " aggregate_layer" ), QStringLiteral ( " memory" ) );
124
124
QVERIFY ( mAggregatesLayer ->isValid () );
125
125
QgsFeature af1 ( mAggregatesLayer ->dataProvider ()->fields (), 1 );
126
126
af1.setGeometry ( QgsGeometry::fromPoint ( QgsPoint ( 0 , 0 ) ) );
127
127
af1.setAttribute ( QStringLiteral ( " col1" ), 4 );
128
128
af1.setAttribute ( QStringLiteral ( " col2" ), " test" );
129
129
af1.setAttribute ( QStringLiteral ( " col3" ), 2 );
130
+ af1.setAttribute ( QStringLiteral ( " col4" ), QVariant ( QVariant::String ) );
130
131
QgsFeature af2 ( mAggregatesLayer ->dataProvider ()->fields (), 2 );
131
132
af2.setGeometry ( QgsGeometry::fromPoint ( QgsPoint ( 1 , 0 ) ) );
132
133
af2.setAttribute ( QStringLiteral ( " col1" ), 2 );
133
134
af2.setAttribute ( QStringLiteral ( " col2" ), QVariant ( QVariant::String ) );
134
135
af2.setAttribute ( QStringLiteral ( " col3" ), 1 );
136
+ af2.setAttribute ( QStringLiteral ( " col4" ), QVariant ( QVariant::String ) );
135
137
QgsFeature af3 ( mAggregatesLayer ->dataProvider ()->fields (), 3 );
136
138
af3.setGeometry ( QgsGeometry::fromPoint ( QgsPoint ( 2 , 0 ) ) );
137
139
af3.setAttribute ( QStringLiteral ( " col1" ), 3 );
138
140
af3.setAttribute ( QStringLiteral ( " col2" ), " test333" );
139
141
af3.setAttribute ( QStringLiteral ( " col3" ), 2 );
142
+ af3.setAttribute ( QStringLiteral ( " col4" ), QVariant ( QVariant::String ) );
140
143
QgsFeature af4 ( mAggregatesLayer ->dataProvider ()->fields (), 4 );
141
144
af4.setGeometry ( QgsGeometry::fromPoint ( QgsPoint ( 3 , 0 ) ) );
142
145
af4.setAttribute ( QStringLiteral ( " col1" ), 2 );
143
146
af4.setAttribute ( QStringLiteral ( " col2" ), " test4" );
144
147
af4.setAttribute ( QStringLiteral ( " col3" ), 2 );
148
+ af4.setAttribute ( QStringLiteral ( " col4" ), " " );
145
149
QgsFeature af5 ( mAggregatesLayer ->dataProvider ()->fields (), 5 );
146
- af5.setGeometry ( QgsGeometry::fromPoint ( QgsPoint ( 4 , 0 ) ) );
150
+ af5.setGeometry ( QgsGeometry ( ) );
147
151
af5.setAttribute ( QStringLiteral ( " col1" ), 5 );
148
152
af5.setAttribute ( QStringLiteral ( " col2" ), QVariant ( QVariant::String ) );
149
153
af5.setAttribute ( QStringLiteral ( " col3" ), 3 );
154
+ af5.setAttribute ( QStringLiteral ( " col4" ), " test" );
150
155
QgsFeature af6 ( mAggregatesLayer ->dataProvider ()->fields (), 6 );
151
156
af6.setGeometry ( QgsGeometry::fromPoint ( QgsPoint ( 5 , 0 ) ) );
152
157
af6.setAttribute ( QStringLiteral ( " col1" ), 8 );
153
158
af6.setAttribute ( QStringLiteral ( " col2" ), " test4" );
154
159
af6.setAttribute ( QStringLiteral ( " col3" ), 3 );
160
+ af6.setAttribute ( QStringLiteral ( " col4" ), " test" );
155
161
mAggregatesLayer ->dataProvider ()->addFeatures ( QgsFeatureList () << af1 << af2 << af3 << af4 << af5 << af6 );
156
162
QgsProject::instance ()->addMapLayer ( mAggregatesLayer );
157
163
@@ -1321,7 +1327,7 @@ class TestQgsExpression: public QObject
1321
1327
QTest::newRow ( " string aggregate 2" ) << " aggregate('test','min_length',\" col2\" )" << false << QVariant ( 5 );
1322
1328
QTest::newRow ( " string concatenate" ) << " aggregate('test','concatenate',\" col2\" ,concatenator:=' , ')" << false << QVariant ( " test1 , test2 , test3 , test4" );
1323
1329
1324
- QTest::newRow ( " geometry collect" ) << " geom_to_wkt(aggregate('aggregate_layer','collect',$geometry))" << false << QVariant ( QStringLiteral ( " MultiPoint ((0 0),(1 0),(2 0),(3 0),(4 0),( 5 0))" ) );
1330
+ QTest::newRow ( " geometry collect" ) << " geom_to_wkt(aggregate('aggregate_layer','collect',$geometry))" << false << QVariant ( QStringLiteral ( " MultiPoint ((0 0),(1 0),(2 0),(3 0),(5 0))" ) );
1325
1331
1326
1332
QTest::newRow ( " sub expression" ) << " aggregate('test','sum',\" col1\" * 2)" << false << QVariant ( 65 * 2 );
1327
1333
QTest::newRow ( " bad sub expression" ) << " aggregate('test','sum',\" xcvxcv\" * 2)" << true << QVariant ();
@@ -1405,7 +1411,8 @@ class TestQgsExpression: public QObject
1405
1411
QTest::newRow ( " max_length" ) << " max_length(\" col2\" )" << false << QVariant ( 7 );
1406
1412
QTest::newRow ( " concatenate" ) << " concatenate(\" col2\" ,concatenator:=',')" << false << QVariant ( " test,,test333,test4,,test4" );
1407
1413
1408
- QTest::newRow ( " geometry collect" ) << " geom_to_wkt(collect($geometry))" << false << QVariant ( QStringLiteral ( " MultiPoint ((0 0),(1 0),(2 0),(3 0),(4 0),(5 0))" ) );
1414
+ QTest::newRow ( " geometry collect" ) << " geom_to_wkt(collect($geometry))" << false << QVariant ( QStringLiteral ( " MultiPoint ((0 0),(1 0),(2 0),(3 0),(5 0))" ) );
1415
+ QTest::newRow ( " geometry collect with null geometry first" ) << " geom_to_wkt(collect($geometry, filter:=\" col3\" =3))" << false << QVariant ( QStringLiteral ( " MultiPoint ((5 0))" ) );
1409
1416
1410
1417
QTest::newRow ( " bad expression" ) << " sum(\" xcvxcvcol1\" )" << true << QVariant ();
1411
1418
QTest::newRow ( " aggregate named" ) << " sum(expression:=\" col1\" )" << false << QVariant ( 24.0 );
@@ -1417,12 +1424,13 @@ class TestQgsExpression: public QObject
1417
1424
QTest::newRow ( " filter" ) << " sum(\" col1\" , NULL, \" col1\" >= 5)" << false << QVariant ( 13 );
1418
1425
QTest::newRow ( " filter named" ) << " sum(expression:=\" col1\" , filter:=\" col1\" >= 5)" << false << QVariant ( 13 );
1419
1426
QTest::newRow ( " filter no matching" ) << " sum(expression:=\" col1\" , filter:=\" col1\" <= -5)" << false << QVariant ( 0 );
1420
- QTest::newRow ( " filter no matching max" ) << " maximum('test', \" xcvxcv \" * 2 )" << false << QVariant ();
1427
+ QTest::newRow ( " filter no matching max" ) << " maximum(\" col1 \" , filter:= \" col1 \" <= -5 )" << false << QVariant ();
1421
1428
1422
1429
QTest::newRow ( " group by" ) << " sum(\" col1\" , \" col3\" )" << false << QVariant ( 9 );
1423
1430
QTest::newRow ( " group by and filter" ) << " sum(\" col1\" , \" col3\" , \" col1\" >=3)" << false << QVariant ( 7 );
1424
1431
QTest::newRow ( " group by and filter named" ) << " sum(expression:=\" col1\" , group_by:=\" col3\" , filter:=\" col1\" >=3)" << false << QVariant ( 7 );
1425
1432
QTest::newRow ( " group by expression" ) << " sum(\" col1\" , \" col1\" % 2)" << false << QVariant ( 16 );
1433
+ QTest::newRow ( " group by with null value" ) << " sum(\" col1\" , \" col4\" )" << false << QVariant ( 9 );
1426
1434
}
1427
1435
1428
1436
void selection ()
@@ -1483,6 +1491,7 @@ class TestQgsExpression: public QObject
1483
1491
af1.setAttribute ( QStringLiteral ( " col1" ), 4 );
1484
1492
af1.setAttribute ( QStringLiteral ( " col2" ), " test" );
1485
1493
af1.setAttribute ( QStringLiteral ( " col3" ), 2 );
1494
+ af1.setAttribute ( QStringLiteral ( " col4" ), QVariant () );
1486
1495
context.setFeature ( af1 );
1487
1496
1488
1497
QFETCH ( QString, string );
@@ -1699,24 +1708,25 @@ class TestQgsExpression: public QObject
1699
1708
QTest::addColumn<QString>( " string" );
1700
1709
QTest::addColumn<QgsGeometry>( " geom" );
1701
1710
QTest::addColumn<bool >( " evalError" );
1702
- QTest::addColumn<double >( " result" );
1711
+ QTest::addColumn<QVariant >( " result" );
1703
1712
1704
1713
QgsPoint point ( 123 , 456 );
1705
1714
QgsPolyline line;
1706
1715
line << QgsPoint ( 1 , 1 ) << QgsPoint ( 4 , 2 ) << QgsPoint ( 3 , 1 );
1707
1716
1708
- QTest::newRow ( " geom x" ) << " $x" << QgsGeometry::fromPoint ( point ) << false << 123 .;
1709
- QTest::newRow ( " geom y" ) << " $y" << QgsGeometry::fromPoint ( point ) << false << 456 .;
1710
- QTest::newRow ( " geom xat" ) << " xat(-1)" << QgsGeometry::fromPolyline ( line ) << false << 3 .;
1711
- QTest::newRow ( " geom yat" ) << " yat(1)" << QgsGeometry::fromPolyline ( line ) << false << 2 .;
1717
+ QTest::newRow ( " geom x" ) << " $x" << QgsGeometry::fromPoint ( point ) << false << QVariant ( 123 . );
1718
+ QTest::newRow ( " geom y" ) << " $y" << QgsGeometry::fromPoint ( point ) << false << QVariant ( 456 . );
1719
+ QTest::newRow ( " geom xat" ) << " xat(-1)" << QgsGeometry::fromPolyline ( line ) << false << QVariant ( 3 . );
1720
+ QTest::newRow ( " geom yat" ) << " yat(1)" << QgsGeometry::fromPolyline ( line ) << false << QVariant ( 2 . );
1721
+ QTest::newRow ( " null geometry" ) << " $geometry" << QgsGeometry () << false << QVariant ( QVariant::UserType );
1712
1722
}
1713
1723
1714
1724
void eval_geometry ()
1715
1725
{
1716
1726
QFETCH ( QString, string );
1717
1727
QFETCH ( QgsGeometry, geom );
1718
1728
QFETCH ( bool , evalError );
1719
- QFETCH ( double , result );
1729
+ QFETCH ( QVariant , result );
1720
1730
1721
1731
QgsFeature f;
1722
1732
f.setGeometry ( geom );
@@ -1728,7 +1738,7 @@ class TestQgsExpression: public QObject
1728
1738
QgsExpressionContext context = QgsExpressionContextUtils::createFeatureBasedContext ( f, QgsFields () );
1729
1739
QVariant out = exp.evaluate ( &context );
1730
1740
QCOMPARE ( exp.hasEvalError (), evalError );
1731
- QCOMPARE ( out. toDouble () , result );
1741
+ QCOMPARE ( out, result );
1732
1742
}
1733
1743
1734
1744
void eval_geometry_calc ()
@@ -2324,6 +2334,9 @@ class TestQgsExpression: public QObject
2324
2334
QCOMPARE ( QgsExpression ( " string_to_array('hello,world',',')" ).evaluate ( &context ), QVariant ( builderExpected ) );
2325
2335
QCOMPARE ( QgsExpression ( " regexp_matches('hello=>world','([A-Za-z]*)=>([A-Za-z]*)')" ).evaluate ( &context ), QVariant ( builderExpected ) );
2326
2336
2337
+ builderExpected << QVariant ();
2338
+ QCOMPARE ( QgsExpression ( " array('hello', 'world', NULL)" ).evaluate ( &context ), QVariant ( builderExpected ) );
2339
+
2327
2340
QCOMPARE ( QgsExpression ( " array_length(\" strings\" )" ).evaluate ( &context ), QVariant ( 2 ) );
2328
2341
2329
2342
QCOMPARE ( QgsExpression ( " array_contains(\" strings\" , 'two')" ).evaluate ( &context ), QVariant ( true ) );
@@ -2383,6 +2396,8 @@ class TestQgsExpression: public QObject
2383
2396
QCOMPARE ( QgsExpression ( " array(1)" ).evaluate ( &context ), QVariant ( builderExpected ) );
2384
2397
builderExpected << 2 ;
2385
2398
QCOMPARE ( QgsExpression ( " array(1, 2)" ).evaluate ( &context ), QVariant ( builderExpected ) );
2399
+ builderExpected << QVariant ();
2400
+ QCOMPARE ( QgsExpression ( " array(1, 2, NULL)" ).evaluate ( &context ), QVariant ( builderExpected ) );
2386
2401
2387
2402
QCOMPARE ( QgsExpression ( " array_contains(\" ints\" , 1)" ).evaluate ( &context ), QVariant ( true ) );
2388
2403
QCOMPARE ( QgsExpression ( " array_contains(\" ints\" , 2)" ).evaluate ( &context ), QVariant ( false ) );
0 commit comments