Ticket #665: mythmusic-speedup-buildtree.patch

File mythmusic-speedup-buildtree.patch, 7.8 KB (added by mythtv@…, 15 years ago)

proposed intoTree process change patch

  • mythmusic/mythmusic/metadata.cpp

     
    898908   
    899909    top_nodes.clear();
    900910    root_node->clearTracks();
     911
     912    QPtrList<Metadata> list;
    901913   
    902914    QPtrListIterator<Metadata> an_iterator( all_music );
    903915    Metadata *inserter;
    904916    while ( (inserter = an_iterator.current()) != 0 )
    905917    {
    906918        if (inserter->isVisible())
    907             intoTree(inserter);
     919            list.append(inserter);
    908920        ++an_iterator;
    909921    }
     922    intoTree(list);
    910923}
    911924
    912925void AllMusic::writeTree(GenericTree *tree_to_write_to)
     
    10061019}
    10071020
    10081021
    1009 void AllMusic::intoTree(Metadata* inserter)
     1022void AllMusic::intoTree(QPtrList<Metadata> &list)
    10101023{
    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;
    10171025    QString a_field = "";
    10181026
    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)
    10241034    {
    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))
    10371036        {
    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;
    10391043        }
     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);
    10401053        ++iter;
    10411054    }
    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    }
    10471065}
    10481066
    10491067QString AllMusic::getLabel(int an_id, bool *error_flag)
     
    12271245MusicNode::MusicNode(QString a_title, QStringList tree_levels, uint depth)
    12281246{
    12291247    my_title = a_title;
     1248
    12301249    if (m_paths == "directory")
    12311250    {
    12321251        my_level = "directory";
     
    12751294    my_tracks.append(inserter);
    12761295}
    12771296
    1278 MusicNode* MusicNode::findRightNode(QStringList tree_levels,
    1279                                     Metadata *inserter, uint depth)
     1297void MusicNode::intoTree(QStringList tree_levels,
     1298                                    MetadataPtrList &list, uint depth)
    12801299{
    12811300    QString a_field = "";
    12821301    QString a_lowercase_field = "";
    12831302    QString a_title = "";
     1303    bool usesPath = false;
    12841304
     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
    12851315    //
    12861316    //  Search and create from my node downards
    12871317    //
    12881318
     1319     QDict<MetadataPtrList> mapping;
     1320     QPtrListIterator<Metadata> iter( list );
     1321     MetadataPtrList *curList;
     1322     mapping.setAutoDelete(true);
    12891323
    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      }
    13201359}
    13211360
    13221361void MusicNode::putYourselfOnTheListView(TreeCheckItem *parent, bool show_node)
  • mythmusic/mythmusic/metadata.h

     
    213227
    214228    void        insert(Metadata* inserter);
    215229    QString     getTitle(){return my_title;}
    216     MusicNode*  findRightNode(QStringList tree_levels, Metadata *inserter,
     230    void        intoTree(QStringList tree_levels, MetadataPtrList &list,
    217231                uint depth);
    218232    void        printYourself(int indent_amount);   // debugging
    219233    void        clearTracks() { my_tracks.clear(); }
     
    231245 
    232246    MetadataPtrList     my_tracks;
    233247    MusicNodePtrList    my_subnodes;
     248    QDict<MusicNode>    my_subnode_hash;
    234249    QString             my_title;
    235250    QString             my_level;
    236251
     
    286303    void        printTree();    // debugging
    287304    void        sortTree();
    288305    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);
    291307    void        setSorting(QString a_paths);
    292308    bool        putYourselfOnTheListView(TreeCheckItem *where, int how_many);
    293309    void        putCDOnTheListView(CDCheckItem *where);