OSDN Git Service

- Gui cleanup - Rework count threads to reduce SQL overhead & improve performance.
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / threads / CounterRunner.java
index 6ad627d..7978804 100644 (file)
@@ -25,33 +25,35 @@ import java.util.Vector;
 import java.util.concurrent.LinkedBlockingQueue;\r
 \r
 import com.evernote.edam.type.Note;\r
-import com.evernote.edam.type.Notebook;\r
-import com.evernote.edam.type.Tag;\r
 import com.trolltech.qt.core.QMutex;\r
 import com.trolltech.qt.core.QObject;\r
 \r
-import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.filters.NotebookCounter;\r
 import cx.fbn.nevernote.filters.TagCounter;\r
 import cx.fbn.nevernote.signals.NotebookSignal;\r
 import cx.fbn.nevernote.signals.TagSignal;\r
 import cx.fbn.nevernote.signals.TrashSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
-import cx.fbn.nevernote.sql.runners.NoteTagsRecord;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class CounterRunner extends QObject implements Runnable {\r
         \r
+       private class NoteRecord {\r
+               public String notebookGuid;\r
+               public Vector<String> tags;\r
+               public boolean active;\r
+               \r
+               public NoteRecord()  {\r
+                       tags = new Vector<String>();\r
+               }\r
+       }\r
        private final ApplicationLogger         logger;\r
        private volatile boolean                        keepRunning;\r
        public int                                                      ID;\r
        public volatile NotebookSignal          notebookSignal;\r
        public volatile TrashSignal                     trashSignal;\r
        public volatile TagSignal                       tagSignal;\r
-       private volatile Vector<String>         notebookIndex;\r
-       private volatile Vector<String>         noteIndex;\r
-       private volatile Vector<Boolean>        activeIndex;\r
+       private volatile Vector<NoteRecord> records;\r
        public int                                                      type;\r
        public QMutex                                           threadLock;\r
        \r
@@ -59,30 +61,30 @@ public class CounterRunner extends QObject implements Runnable {
        public static int                                       NOTEBOOK=1;\r
        public static int                                       TAG=2;\r
        public static int                                       TRASH=3;\r
-       public static int                                       TAG_ALL = 4;\r
-       public static int                                       NOTEBOOK_ALL = 5;\r
        \r
        public boolean                                          ready = false;\r
        public boolean                                          abortCount = false;\r
+       private final DatabaseConnection                                        conn;\r
+\r
        private volatile LinkedBlockingQueue<Integer> readyQueue = new LinkedBlockingQueue<Integer>();\r
        \r
        \r
        //*********************************************\r
        //* Constructor                               *\r
        //*********************************************\r
-       public CounterRunner(String logname, int t) {\r
+       public CounterRunner(String logname, int t, String u, String i, String r, String uid, String pswd, String cpswd) {\r
                type = t;\r
+\r
                threadLock = new QMutex();\r
                logger = new ApplicationLogger(logname);\r
 //             setAutoDelete(false);   \r
+               conn = new DatabaseConnection(logger, u, i, r, uid, pswd, cpswd, 300);\r
                keepRunning = true;\r
                notebookSignal = new NotebookSignal();\r
                tagSignal = new TagSignal();\r
                trashSignal = new TrashSignal();\r
                \r
-               notebookIndex = new Vector<String>();\r
-               activeIndex = new Vector<Boolean>();\r
-               noteIndex = new Vector<String>();\r
+               records = new Vector<NoteRecord>();\r
        }\r
        \r
        \r
@@ -105,17 +107,14 @@ public class CounterRunner extends QObject implements Runnable {
                                        keepRunning = false;\r
                                if (type == NOTEBOOK)\r
                                        countNotebookResults();\r
-                               if (type == NOTEBOOK_ALL)\r
-                                       countNotebookResults();\r
                                if (type == TAG)\r
                                        countTagResults();\r
-                               if (type == TAG_ALL)\r
-                                       countTagResults();\r
                                if (type == TRASH)\r
                                        countTrashResults();\r
                                threadLock.unlock();\r
                        } catch (InterruptedException e) {}\r
                }\r
+               conn.dbShutdown();\r
        }\r
        \r
        \r
@@ -124,21 +123,20 @@ public class CounterRunner extends QObject implements Runnable {
                abortCount = true;\r
                threadLock.lock();\r
                abortCount = false;\r
-               notebookIndex.clear();\r
-               activeIndex.clear();\r
-               noteIndex.clear();\r
+               records.clear();\r
                if (idx != null) {\r
                        for (int i=0; i<idx.size(); i++) {\r
-                               if (Global.showDeleted && !idx.get(i).isActive()) {\r
-                                       notebookIndex.add(new String(idx.get(i).getNotebookGuid()));\r
-                                       noteIndex.add(new String(idx.get(i).getGuid()));\r
-                                       activeIndex.add(new Boolean(idx.get(i).isActive()));\r
-                               }  \r
-                               if (!Global.showDeleted && idx.get(i).isActive()) {\r
-                                       notebookIndex.add(new String(idx.get(i).getNotebookGuid()));\r
-                                       noteIndex.add(new String(idx.get(i).getGuid()));\r
-                                       activeIndex.add(new Boolean(idx.get(i).isActive()));                                    \r
+                               if (abortCount)\r
+                                       return;\r
+                               NoteRecord record = new NoteRecord();\r
+                               record.notebookGuid = new String(idx.get(i).getNotebookGuid());\r
+                               record.active = idx.get(i).isActive();\r
+                               for (int j=0; j<idx.get(i).getTagGuidsSize(); j++) {\r
+                                       if (abortCount)\r
+                                               return;\r
+                                       record.tags.add(new String(idx.get(i).getTagGuids().get(j)));\r
                                }\r
+                               records.add(record);\r
                        }\r
                }\r
                threadLock.unlock();\r
@@ -166,72 +164,23 @@ public class CounterRunner extends QObject implements Runnable {
                logger.log(logger.EXTREME, "Entering ListManager.countNotebookResults");                \r
                if (abortCount)\r
                        return;\r
-               DatabaseConnection conn = new DatabaseConnection(Global.tagCounterThreadId);\r
                List<NotebookCounter> nCounter = new ArrayList<NotebookCounter>();\r
-               if (abortCount)\r
-                       return;\r
-               List<Notebook> books = conn.getNotebookTable().getAll();\r
-                               \r
-               if (abortCount)\r
-                       return;\r
-\r
-               if (type == NOTEBOOK_ALL) {\r
-                       for (int i=0; i<books.size(); i++) {\r
-                               if (abortCount)\r
-                                       return;\r
-\r
-                               nCounter.add(new NotebookCounter());\r
-                               nCounter.get(i).setCount(0);\r
-                               nCounter.get(i).setGuid(books.get(i).getGuid());\r
-                       }\r
-                       if (abortCount)\r
-                               return;\r
-                       List<Pair<String, Integer>> notebookCounts = conn.getNotebookTable().getNotebookCounts();\r
+               for (int i=0; i<records.size(); i++) {\r
                        if (abortCount)\r
                                return;\r
-                       for (int i=0; notebookCounts != null && i<notebookCounts.size(); i++) {\r
+                       boolean found = false;\r
+                       for (int j=0; j<nCounter.size(); j++) {\r
                                if (abortCount)\r
                                        return;\r
-                               for (int j=0; j<nCounter.size(); j++) {\r
-                                       if (abortCount)\r
-                                               return;\r
-\r
-                                       if (notebookCounts.get(i).getFirst().equals(nCounter.get(j).getGuid())) {\r
-                                               nCounter.get(j).setCount(notebookCounts.get(i).getSecond());\r
-                                               j=nCounter.size();\r
-                                       }\r
-                               }\r
-                       }\r
-                       if (abortCount)\r
-                               return;\r
-\r
-                       notebookSignal.countsChanged.emit(nCounter);\r
-                       return;\r
-               }\r
-               \r
-               if (abortCount)\r
-                       return;\r
-               for (int i=notebookIndex.size()-1; i>=0 && keepRunning; i--) {\r
-                       if (abortCount)\r
-                               return;\r
-                       boolean notebookFound = false;\r
-                       for (int j=0; j<nCounter.size() && keepRunning; j++) {\r
-                               if (abortCount)\r
-                                       return;\r
-                               if (nCounter.get(j).getGuid().equals(notebookIndex.get(i))) {\r
-                                       notebookFound = true;\r
-                                       if (activeIndex.get(i)) {\r
-                                               int c = nCounter.get(j).getCount()+1;\r
-                                               nCounter.get(j).setCount(c);\r
-                                       }\r
+                               if (nCounter.get(j).getGuid().equals(records.get(i).notebookGuid)) {\r
+                                       nCounter.get(j).setCount(nCounter.get(j).getCount()+1);\r
+                                       found = true;\r
                                        j=nCounter.size();\r
                                }\r
                        }\r
-                       if (abortCount)\r
-                               return;\r
-                       if (!notebookFound) {\r
+                       if (!found) {\r
                                NotebookCounter newCounter = new NotebookCounter();\r
-                               newCounter.setGuid(notebookIndex.get(i));\r
+                               newCounter.setGuid(records.get(i).notebookGuid);\r
                                newCounter.setCount(1);\r
                                nCounter.add(newCounter);\r
                        }\r
@@ -243,9 +192,9 @@ public class CounterRunner extends QObject implements Runnable {
        }\r
        \r
        \r
+       /*\r
        private void countTagResults() {\r
                logger.log(logger.EXTREME, "Entering ListManager.countTagResults");             \r
-               DatabaseConnection conn = new DatabaseConnection(Global.tagCounterThreadId);\r
                List<TagCounter> counter = new ArrayList<TagCounter>();\r
                List<Tag> allTags = conn.getTagTable().getAll();\r
                \r
@@ -287,7 +236,7 @@ public class CounterRunner extends QObject implements Runnable {
                \r
                if (abortCount)\r
                        return;\r
-               List<NoteTagsRecord> tags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
+               List<cx.fbn.nevernote.sql.NoteTagsRecord> tags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
                for (int i=noteIndex.size()-1; i>=0; i--) {\r
                        if (abortCount)\r
                                return;\r
@@ -310,16 +259,56 @@ public class CounterRunner extends QObject implements Runnable {
                        return;\r
                tagSignal.countsChanged.emit(counter);\r
                logger.log(logger.EXTREME, "Leaving ListManager.countTagResults()");\r
+       } */\r
+       private void countTagResults() {\r
+               logger.log(logger.EXTREME, "Entering ListManager.countTagResults");     \r
+               if (abortCount)\r
+                       return;\r
+               List<TagCounter> tCounter = new ArrayList<TagCounter>();\r
+               for (int i=0; i<records.size(); i++) {\r
+                       if (abortCount)\r
+                               return;\r
+                       \r
+                       // Loop through the list of tags so we can count them\r
+                       Vector<String> tags = records.get(i).tags;\r
+                       for (int z=0; z<tags.size(); z++) {\r
+                               boolean found = false;\r
+                               for (int j=0; j<tCounter.size(); j++) {\r
+                                       if (abortCount)\r
+                                               return;\r
+                                       if (tCounter.get(j).getGuid().equals(tags.get(z))) {\r
+                                               tCounter.get(j).setCount(tCounter.get(j).getCount()+1);\r
+                                               found = true;\r
+                                               j=tCounter.size();\r
+                                       }\r
+                               }\r
+                               if (!found) {\r
+                                       TagCounter newCounter = new TagCounter();\r
+                                       newCounter.setGuid(tags.get(z));\r
+                                       newCounter.setCount(1);\r
+                                       tCounter.add(newCounter);\r
+                               }\r
+                       }\r
+               }\r
+               if (abortCount)\r
+                       return;\r
+               tagSignal.countsChanged.emit(tCounter);\r
+               logger.log(logger.EXTREME, "Leaving ListManager.countTagResults");      \r
        }\r
        \r
        \r
        private void countTrashResults() {\r
                logger.log(logger.EXTREME, "Entering CounterRunner.countTrashResults()");               \r
-               DatabaseConnection conn = new DatabaseConnection(Global.trashCounterThreadId);\r
                if (abortCount)\r
                        return;\r
 \r
-               Integer tCounter = conn.getNoteTable().getDeletedCount();\r
+               int tCounter = 0;\r
+               for (int i=0; i<records.size(); i++) {\r
+                       if (abortCount)\r
+                               return;\r
+                       if (!records.get(i).active)\r
+                               tCounter++;\r
+               }\r
                \r
                if (abortCount)\r
                        return;\r