@@ -921,6 +921,9 @@ - (BOOL)isEmpty
921
921
922
922
- (void )addFilterExpression
923
923
{
924
+ // reject this if no table columns exist: would cause invalid state (empty filter rows)
925
+ if (![columns count ]) return ;
926
+
924
927
[filterRuleEditor insertRowAtIndex: 0 withType: NSRuleEditorRowTypeSimple asSubrowOfRow: -1 animate: NO ];
925
928
}
926
929
@@ -979,7 +982,8 @@ - (NSDictionary *)_serializedFilterIncludingFilterDefinition:(BOOL)includeDefini
979
982
{
980
983
NSMutableArray *rootItems = [NSMutableArray arrayWithCapacity: [[_modelContainer model ] count ]];
981
984
for (NSDictionary *item in [_modelContainer model ]) {
982
- [rootItems addObject: [self _serializeSubtree: item includingDefinition: includeDefinition]];
985
+ NSDictionary *sub = [self _serializeSubtree: item includingDefinition: includeDefinition];
986
+ if (sub) [rootItems addObject: sub];
983
987
}
984
988
// the root serialized filter can either be an AND of multiple root items or a single root item
985
989
if ([rootItems count ] == 1 ) {
@@ -1003,7 +1007,8 @@ - (NSDictionary *)_serializeSubtree:(NSDictionary *)item includingDefinition:(BO
1003
1007
NSArray *subrows = [item objectForKey: @" subrows" ];
1004
1008
NSMutableArray *children = [[NSMutableArray alloc ] initWithCapacity: [subrows count ]];
1005
1009
for (NSDictionary *subitem in subrows) {
1006
- [children addObject: [self _serializeSubtree: subitem includingDefinition: includeDefinition]];
1010
+ NSDictionary *sub = [self _serializeSubtree: subitem includingDefinition: includeDefinition];
1011
+ if (sub) [children addObject: sub];
1007
1012
}
1008
1013
StringNode *node = [[item objectForKey: @" criteria" ] objectAtIndex: 0 ];
1009
1014
BOOL isConjunction = [@" AND" isEqualToString: [node value ]];
@@ -1018,6 +1023,9 @@ - (NSDictionary *)_serializeSubtree:(NSDictionary *)item includingDefinition:(BO
1018
1023
else {
1019
1024
NSArray *criteria = [item objectForKey: @" criteria" ];
1020
1025
NSArray *displayValues = [item objectForKey: @" displayValues" ];
1026
+ if ([criteria count ] < 2 || [criteria count ] != [displayValues count ]) {
1027
+ return nil ;
1028
+ }
1021
1029
ColumnNode *col = [criteria objectAtIndex: 0 ];
1022
1030
OpNode *op = [criteria objectAtIndex: 1 ];
1023
1031
NSMutableArray *filterValues = [[NSMutableArray alloc ] initWithCapacity: 2 ];
0 commit comments