Ticket #665: mythmusic-speedup-buildtree.patch
File mythmusic-speedup-buildtree.patch, 7.8 KB (added by , 18 years ago) |
---|
-
mythmusic/mythmusic/metadata.cpp
898 908 899 909 top_nodes.clear(); 900 910 root_node->clearTracks(); 911 912 QPtrList<Metadata> list; 901 913 902 914 QPtrListIterator<Metadata> an_iterator( all_music ); 903 915 Metadata *inserter; 904 916 while ( (inserter = an_iterator.current()) != 0 ) 905 917 { 906 918 if (inserter->isVisible()) 907 intoTree(inserter);919 list.append(inserter); 908 920 ++an_iterator; 909 921 } 922 intoTree(list); 910 923 } 911 924 912 925 void AllMusic::writeTree(GenericTree *tree_to_write_to) … … 1006 1019 } 1007 1020 1008 1021 1009 void AllMusic::intoTree( Metadata* inserter)1022 void AllMusic::intoTree(QPtrList<Metadata> &list) 1010 1023 { 1011 MusicNode *insertion_point = findRightNode(inserter, 0); 1012 insertion_point->insert(inserter); 1013 } 1014 1015 MusicNode* AllMusic::findRightNode(Metadata* inserter, uint depth) 1016 { 1024 uint depth = 0; 1017 1025 QString a_field = ""; 1018 1026 1019 // Use metadata to find pre-exisiting insertion 1020 // point or (recursively) create nodes as needed 1021 // and return ultimate insertion point 1022 1023 if(inserter->areYouFinished(depth, tree_levels.count(), paths, startdir)) 1027 QDict<MetadataPtrList> mapping; 1028 QPtrListIterator<Metadata> iter( list ); 1029 MetadataPtrList *curList; 1030 mapping.setAutoDelete(true); 1031 1032 Metadata *cur; 1033 while ((cur = iter.current()) != 0) 1024 1034 { 1025 // special case, track is at root level 1026 // e.g. an mp3 in the root directory and 1027 // paths=directory 1028 return root_node; 1029 } 1030 1031 inserter->getField(tree_levels.first(), &a_field, paths, startdir, depth); 1032 QPtrListIterator<MusicNode> iter( top_nodes ); 1033 MusicNode *search; 1034 while ( (search = iter.current()) != 0 ) 1035 { 1036 if(a_field == search->getTitle()) 1035 if(cur->areYouFinished(depth, tree_levels.count(), paths, startdir)) 1037 1036 { 1038 return ( search->findRightNode(tree_levels, inserter, depth + 1) ); 1037 // special case, track is at root level 1038 // e.g. an mp3 in the root directory and 1039 // paths=directory 1040 root_node->insert(cur); 1041 ++iter; 1042 continue; 1039 1043 } 1044 1045 cur->getField(tree_levels.first(), &a_field, paths, startdir, depth); 1046 curList = mapping.find(a_field); 1047 if (!curList) 1048 { 1049 curList = new MetadataPtrList; 1050 mapping.insert(a_field, curList); 1051 } 1052 curList->append(cur); 1040 1053 ++iter; 1041 1054 } 1042 // If we made it here, no appropriate top level node exists 1043 1044 MusicNode *new_one = new MusicNode(a_field, tree_levels, 0); 1045 top_nodes.append(new_one); 1046 return ( new_one->findRightNode(tree_levels, inserter, depth + 1) ); 1055 1056 QDictIterator<MetadataPtrList> rest(mapping); 1057 while ((curList = rest.current()) != 0) 1058 { 1059 a_field = rest.currentKey(); 1060 MusicNode *new_one = new MusicNode(a_field, tree_levels, 0); 1061 top_nodes.append(new_one); 1062 new_one->intoTree(tree_levels, *curList, depth + 1); 1063 ++rest; 1064 } 1047 1065 } 1048 1066 1049 1067 QString AllMusic::getLabel(int an_id, bool *error_flag) … … 1227 1245 MusicNode::MusicNode(QString a_title, QStringList tree_levels, uint depth) 1228 1246 { 1229 1247 my_title = a_title; 1248 1230 1249 if (m_paths == "directory") 1231 1250 { 1232 1251 my_level = "directory"; … … 1275 1294 my_tracks.append(inserter); 1276 1295 } 1277 1296 1278 MusicNode* MusicNode::findRightNode(QStringList tree_levels,1279 Metadata *inserter, uint depth)1297 void MusicNode::intoTree(QStringList tree_levels, 1298 MetadataPtrList &list, uint depth) 1280 1299 { 1281 1300 QString a_field = ""; 1282 1301 QString a_lowercase_field = ""; 1283 1302 QString a_title = ""; 1303 bool usesPath = false; 1284 1304 1305 if (m_paths == "directory") usesPath = true; 1306 else 1307 { 1308 if (depth + 1 >= tree_levels.count()) 1309 { 1310 my_tracks = list; 1311 return; 1312 } 1313 } 1314 1285 1315 // 1286 1316 // Search and create from my node downards 1287 1317 // 1288 1318 1319 QDict<MetadataPtrList> mapping; 1320 QPtrListIterator<Metadata> iter( list ); 1321 MetadataPtrList *curList; 1322 mapping.setAutoDelete(true); 1289 1323 1290 if(inserter->areYouFinished(depth, tree_levels.count(), m_paths, m_startdir)) 1291 { 1292 return this; 1293 } 1294 else 1295 { 1296 inserter->getField(tree_levels, &a_field, m_paths, m_startdir, depth); 1297 1298 a_lowercase_field = a_field.lower(); 1299 if (a_lowercase_field.left(4) == "the ") 1300 a_lowercase_field = a_lowercase_field.mid(4); 1301 1302 QPtrListIterator<MusicNode> iter(my_subnodes); 1303 MusicNode *search; 1304 while ((search = iter.current() ) != 0) 1305 { 1306 a_title = search->getTitle().lower(); 1307 if (a_title.left(4) == thePrefix) 1308 a_title = a_title.mid(4); 1309 1310 if (a_lowercase_field == a_title) 1311 { 1312 return( search->findRightNode(tree_levels, inserter, depth + 1) ); 1313 } 1314 ++iter; 1315 } 1316 MusicNode *new_one = new MusicNode(a_field, tree_levels, depth); 1317 my_subnodes.append(new_one); 1318 return (new_one->findRightNode(tree_levels, inserter, depth + 1) ); 1319 } 1324 Metadata *cur; 1325 while ((cur = iter.current()) != 0) 1326 { 1327 if(usesPath && cur->areYouFinished(depth, tree_levels.count(), m_paths, m_startdir)) 1328 { 1329 insert(cur); 1330 ++iter; 1331 continue; 1332 } 1333 1334 cur->getField(tree_levels, &a_field, m_paths, m_startdir, depth); 1335 1336 a_lowercase_field = a_field.lower(); 1337 if (a_lowercase_field.left(4) == "the ") 1338 a_lowercase_field = a_lowercase_field.mid(4); 1339 1340 curList = mapping.find(a_lowercase_field); 1341 if (!curList) 1342 { 1343 curList = new MetadataPtrList; 1344 mapping.insert(a_lowercase_field, curList); 1345 } 1346 curList->append(cur); 1347 ++iter; 1348 } 1349 1350 QDictIterator<MetadataPtrList> rest(mapping); 1351 while ((curList = rest.current()) != 0) 1352 { 1353 a_field = rest.currentKey(); 1354 MusicNode *new_one = new MusicNode(a_field, tree_levels, depth); 1355 my_subnodes.append(new_one); 1356 new_one->intoTree(tree_levels, *curList, depth + 1); 1357 ++rest; 1358 } 1320 1359 } 1321 1360 1322 1361 void MusicNode::putYourselfOnTheListView(TreeCheckItem *parent, bool show_node) -
mythmusic/mythmusic/metadata.h
213 227 214 228 void insert(Metadata* inserter); 215 229 QString getTitle(){return my_title;} 216 MusicNode* findRightNode(QStringList tree_levels, Metadata *inserter,230 void intoTree(QStringList tree_levels, MetadataPtrList &list, 217 231 uint depth); 218 232 void printYourself(int indent_amount); // debugging 219 233 void clearTracks() { my_tracks.clear(); } … … 231 245 232 246 MetadataPtrList my_tracks; 233 247 MusicNodePtrList my_subnodes; 248 QDict<MusicNode> my_subnode_hash; 234 249 QString my_title; 235 250 QString my_level; 236 251 … … 286 303 void printTree(); // debugging 287 304 void sortTree(); 288 305 void writeTree(GenericTree *tree_to_write_to); 289 void intoTree(Metadata* inserter); 290 MusicNode* findRightNode(Metadata* inserter, uint depth); 306 void intoTree(QPtrList<Metadata> &list); 291 307 void setSorting(QString a_paths); 292 308 bool putYourselfOnTheListView(TreeCheckItem *where, int how_many); 293 309 void putCDOnTheListView(CDCheckItem *where);