@@ -143,6 +143,42 @@ class TestQgsRuleBasedRenderer: public QObject
143
143
delete clone;
144
144
}
145
145
146
+ /* *
147
+ * test_many_rules_expression_filter checks that with > 50 rules we have a binary tree (log2(N))
148
+ */
149
+ void test_many_rules_expression_filter ()
150
+ {
151
+
152
+ QgsVectorLayer *layer = new QgsVectorLayer ( QStringLiteral ( " point?field=fld:int" ), QStringLiteral ( " x" ), QStringLiteral ( " memory" ) );
153
+ QgsRenderContext ctx; // dummy render context
154
+ ctx.expressionContext ().setFields ( layer->fields () );
155
+
156
+ std::function<QString ( const int ruleCount )> makeFilter = [ & ]( const int rc ) -> QString
157
+ {
158
+
159
+ // prepare renderer
160
+ RRule *rootRule = new RRule ( nullptr );
161
+ for ( int i = 0 ; i < rc; i++ )
162
+ {
163
+ rootRule->appendChild ( new RRule ( nullptr , 0 , 0 , QStringLiteral ( " %1" ).arg ( i ) ) );
164
+ }
165
+ QgsRuleBasedRenderer r ( rootRule );
166
+ r.startRender ( ctx, layer->fields () );
167
+ r.stopRender ( ctx );
168
+ return r.filter ();
169
+ };
170
+
171
+ QCOMPARE ( makeFilter ( 1 ), QString ( " (0)" ) );
172
+ QCOMPARE ( makeFilter ( 2 ), QString ( " (0) OR (1)" ) );
173
+ QCOMPARE ( makeFilter ( 3 ), QString ( " (0) OR (1) OR (2)" ) );
174
+ QCOMPARE ( makeFilter ( 10 ), QString ( " (0) OR (1) OR (2) OR (3) OR (4) OR (5) OR (6) OR (7) OR (8) OR (9)" ) );
175
+ QCOMPARE ( makeFilter ( 51 ), QString ( " (((((0) OR ((1) OR (2))) OR ((3) OR ((4) OR (5)))) OR (((6) OR ((7) OR (8))) OR ((9) OR ((10) OR (11))))) OR "
176
+ " ((((12) OR ((13) OR (14))) OR ((15) OR ((16) OR (17)))) OR (((18) OR ((19) OR (20))) OR (((21) OR (22)) OR ((23) OR (24)))))) OR "
177
+ " (((((25) OR ((26) OR (27))) OR ((28) OR ((29) OR (30)))) OR (((31) OR ((32) OR (33))) OR (((34) OR (35)) OR ((36) OR (37))))) OR "
178
+ " ((((38) OR ((39) OR (40))) OR ((41) OR ((42) OR (43)))) OR (((44) OR ((45) OR (46))) OR (((47) OR (48)) OR ((49) OR (50))))))" ) );
179
+
180
+ }
181
+
146
182
private:
147
183
void xml2domElement ( const QString &testFile, QDomDocument &doc )
148
184
{
0 commit comments