Revision: 28949
          http://sourceforge.net/p/bibdesk/svn/28949
Author:   hofman
Date:     2024-09-27 16:15:58 +0000 (Fri, 27 Sep 2024)
Log Message:
-----------
Look up old category groups for rebuilding in temporary map table to avoid 
quadratic comparisons

Modified Paths:
--------------
    trunk/bibdesk/BibDocument_Groups.m

Modified: trunk/bibdesk/BibDocument_Groups.m
===================================================================
--- trunk/bibdesk/BibDocument_Groups.m  2024-09-17 14:38:18 UTC (rev 28948)
+++ trunk/bibdesk/BibDocument_Groups.m  2024-09-27 16:15:58 UTC (rev 28949)
@@ -446,13 +446,6 @@
     docFlags.ignoreGroupUIChange = NO;
 }
 
-static BDSKCategoryGroup *groupWithName(NSArray *groups, id name) {
-    for (BDSKCategoryGroup *aGroup in groups)
-        if ([[aGroup name] isEqual:name])
-            return aGroup;
-    return nil;
-}
-
 // this method uses counted sets to compute the number of publications per 
group; each group object is just a name
 // and a count, and a group knows how to compare itself with other groups for 
sorting/equality, but doesn't know
 // which pubs are associated with it
@@ -475,12 +468,18 @@
     NSHashTable *hashTable = [[NSHashTable alloc] 
initWithPointerFunctions:pointerFunctions capacity:0];
     CFMutableBagRef bag = CFBagCreateMutable(kCFAllocatorDefault, 0, 
&bagCallBacks);
     
-    NSArray *oldGroups = [parent categoryGroups];
-    BDSKCategoryGroup *group = [oldGroups firstObject];
+    NSMapTable *oldGroups = nil;
+    BDSKCategoryGroup *group = [[parent categoryGroups] firstObject];
     
-    if ([groupField isEqualToString:[group key]] == NO || [groupField 
isPersonField] != [[group name] isKindOfClass:[BibAuthor class]])
-        oldGroups = nil;
+    if ([groupField isEqualToString:[group key]] && [groupField isPersonField] 
== [[group name] isKindOfClass:[BibAuthor class]]) {
+        oldGroups = [NSMapTable strongToStrongObjectsMapTable];
+        for (BDSKCategoryGroup *aGroup in [parent categoryGroups])
+            [oldGroups setObject:aGroup forKey:[aGroup name]];
+    }
     
+    NSMapTable *oldGroupTable = [NSMapTable strongToStrongObjectsMapTable];
+    
+    
     NSInteger emptyCount = 0;
     
     NSHashTable *tmpSet = nil;
@@ -501,7 +500,7 @@
     
     // now add the group names that we found from our BibItems, using a 
generic folder icon
     for (id groupName in hashTable) {
-        group = groupWithName(oldGroups, groupName);
+        group = [oldGroups objectForKey:groupName];
         // don't reuse groups with invalidated authors
         if (isPersonField && [(BibAuthor *)[group name] publication] == nil)
             group = nil;
@@ -514,9 +513,8 @@
     // add the "empty" group at index 0; this is a group of pubs whose value 
is empty for this field, so they
     // will not be contained in any of the other groups for the currently 
selected group field (hence multiple selection is desirable)
     if (emptyCount > 0) {
-        if ([oldGroups count] && [[oldGroups objectAtIndex:0] isEmpty])
-            group = [oldGroups objectAtIndex:0];
-        else
+        group = [oldGroups objectForKey:[BibAuthor emptyAuthor]];
+        if (group == nil)
             group = [[BDSKCategoryGroup alloc] initWithName:nil 
key:groupField];
         [group setCount:emptyCount];
         [mutableGroups insertObject:group atIndex:0];

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
Bibdesk-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to