-rewrite most of the label management code to be much more efficient
-ensure label modifications always act on the right set of tests, by ensuring the GWT client uses the right SQL condition



git-svn-id: http://test.kernel.org/svn/autotest/trunk@2017 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/new_tko/tko/models.py b/new_tko/tko/models.py
index 277a45c..1e40240 100644
--- a/new_tko/tko/models.py
+++ b/new_tko/tko/models.py
@@ -132,14 +132,6 @@
         db_table = 'jobs'
 
 
-class TestManager(dbmodels.Manager):
-    'Custom manager for Test model'
-    def query_using_test_view(self, filter_data):
-        test_ids = [test_view.test_idx for test_view
-                    in TestView.query_objects(filter_data)]
-        return self.in_bulk(test_ids).values()
-
-
 class Test(dbmodels.Model):
     test_idx = dbmodels.IntegerField(primary_key=True)
     job = dbmodels.ForeignKey(Job, db_column='job_idx')
@@ -152,8 +144,6 @@
     finished_time = dbmodels.DateTimeField(null=True, blank=True)
     started_time = dbmodels.DateTimeField(null=True, blank=True)
 
-    objects = TestManager()
-
     class Meta:
         db_table = 'tests'
 
@@ -237,26 +227,53 @@
         return query.extra(select=extra_select)
 
 
+    def _add_label_joins(self, query_set):
+        table_name = self.model._meta.db_table
+        filter_object = self._JoinQ()
+        filter_object.add_join(
+            'test_labels_tests',
+            'test_labels_tests.test_id = %s.test_idx' % table_name,
+            'LEFT JOIN')
+        filter_object.add_join(
+            'test_labels',
+            'test_labels.id = test_labels_tests.testlabel_id',
+            'LEFT JOIN')
+        return query_set.complex_filter(filter_object).distinct()
+
+
     def get_query_set_with_labels(self, filter_data):
         query_set = self.get_query_set()
         # TODO: make this check more thorough if necessary
         if 'test_labels' in filter_data.get('extra_where', ''):
-            table_name = self.model._meta.db_table
-            filter_object = self._JoinQ()
-            filter_object.add_join(
-                'test_labels_tests',
-                'test_labels_tests.test_id = %s.test_idx' % table_name,
-                'LEFT JOIN')
-            filter_object.add_join(
-                'test_labels',
-                'test_labels.id = test_labels_tests.testlabel_id',
-                'LEFT JOIN')
-            query_set = query_set.complex_filter(filter_object).distinct()
+            query_set = self._add_label_joins(query_set)
         else:
             filter_data['no_distinct'] = True
         return query_set
 
 
+    def query_test_ids(self, filter_data):
+        dicts = self.model.query_objects(filter_data).values('test_idx')
+        return [item['test_idx'] for item in dicts]
+
+
+    def _custom_select_query(self, query_set, selects):
+        query_selects, where, params = query_set._get_sql_clause()
+        if query_set._distinct:
+            distinct = 'DISTINCT '
+        else:
+            distinct = ''
+        sql_query = 'SELECT ' + distinct + ','.join(selects) + where
+        cursor = readonly_connection.connection.cursor()
+        cursor.execute(sql_query, params)
+        return cursor.fetchall()
+
+
+    def query_test_label_ids(self, filter_data):
+        query_set = self._add_label_joins(self.get_query_set()).distinct()
+        rows = self._custom_select_query(query_set, ['test_labels.id'])
+        return [row[0] for row in rows] # flatten rows to a list of ids
+
+
 class TestView(dbmodels.Model, model_logic.ModelExtensions):
     extra_fields = {
         'DATE(test_finished_time)' : 'test finished day',