Support job keyvals and iteration attributes in the query_results CLI

Signed-off-by: James Ren <[email protected]>

--- autotest/cli/query_results  2010-03-26 13:03:30.000000000 -0700
+++ autotest/cli/query_results  2010-03-26 13:03:30.000000000 -0700
@@ -21,17 +21,17 @@
                   "condition syntax for new tko (see "
                   "http://autotest.kernel.org/wiki/TkoHowTo for more info)"))
 parser.add_option(
-        '--attribute-field', action='append', default=[],
+        '--test-attribute-field', action='append', default=[],
         help='Specifies a test attribute to include as a field.  The attribute 
'
              'value will be available as a field named attribute_<attribute '
              'name>.  This option may be specified multiple times.  Filtering '
              'must be done slightly differently -- see '
              'http://autotest.kernel.org/wiki/TkoHowTo#attribute_filtering '
              'for more details.')
-parser.add_option('--label-field', action='append', default=[],
+parser.add_option('--test-label-field', action='append', default=[],
                   help='Specifies a test label to include as a field.  See '
                        '--attribute-field for more details')
-parser.add_option('--iteration-field', action='append', default=[],
+parser.add_option('--iteration-result-field', action='append', default=[],
                   help='Specifies an iteration result to include as a field.  '
                        'See --attribute-field for more details.  Note that '
                        'this causes the rows returned to represent iterations '
@@ -39,6 +39,14 @@
 parser.add_option('--machine-label-field', action='append', default=[],
                   help='Specifies a machine label to include as a field.  See '
                        '--attribute-field for more details')
+parser.add_option('--job-keyval-field', action='append', default=[],
+                  help='Specifies a job keyval to include as a field. See '
+                       '--attribute-field for more details')
+parser.add_option('--iteration-attribute-field', action='append', default=[],
+                  help='Specifies an iteration attribute to include as a '
+                       'field. See --attribute-field for more details.  Note '
+                       'that this causes the rows returned to represent '
+                       'iterations rather than plain test results.')
 parser.add_option('-s', '--separator', action='store', default = ' | ',
             dest='separator', help = 'output separator')
 parser.add_option('-n', '--nocount', action='store_true', default=False,
@@ -80,11 +88,14 @@
 # Grab the data
 tko = rpc.tko_comm()
 count = 0
-test_views = tko.run('get_test_views', extra_where=where,
-                     test_attribute_fields=options.attribute_field,
-                     test_label_fields=options.label_field,
-                     iteration_fields=options.iteration_field,
-                     machine_label_fields=options.machine_label_field)
+test_views = tko.run(
+        'get_test_views', extra_where=where,
+        test_attribute_fields=options.test_attribute_field,
+        test_label_fields=options.test_label_field,
+        iteration_result_fields=options.iteration_result_field,
+        machine_label_fields=options.machine_label_field,
+        job_keyval_fields=options.job_keyval_field,
+        iteration_attribute_fields=options.iteration_attribute_field)
 for test_view in test_views:
     values = [str(test_view[column]) for column in columns]
     if options.logpath:
--- autotest/frontend/client/src/autotest/tko/CommonPanel.java  2010-03-26 
13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/CommonPanel.java  2010-03-26 
13:03:30.000000000 -0700
@@ -158,7 +158,7 @@
         if (!savedShowInvalid) {
             
parameterizedFieldPresenter.addFieldIfNotPresent(TestLabelField.TYPE_NAME,
                                                              "invalidated");
-            condition = "(" + condition + ") AND label_invalidated.id IS NULL";
+            condition = "(" + condition + ") AND test_label_invalidated.id IS 
NULL";
         }
 
         JSONObject conditionArgs = new JSONObject();
--- /dev/null   2009-12-17 12:29:38.000000000 -0800
+++ autotest/frontend/client/src/autotest/tko/IterationAttributeField.java      
2010-03-26 13:03:30.000000000 -0700
@@ -0,0 +1,26 @@
+package autotest.tko;
+
+
+public class IterationAttributeField extends AttributeField {
+    public static final String TYPE_NAME = "Iteration result";
+
+    @Override
+    protected ParameterizedField freshInstance() {
+        return new IterationAttributeField();
+    }
+
+    @Override
+    public String getTypeName() {
+        return TYPE_NAME;
+    }
+    
+    @Override
+    protected String getFieldParameterName() {
+        return "iteration_attribute_fields";
+    }
+
+    @Override
+    public String getBaseSqlName() {
+        return "iteration_attribute_";
+    }
+}
--- autotest/frontend/client/src/autotest/tko/IterationResultField.java 
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/IterationResultField.java 
2010-03-26 13:03:30.000000000 -0700
@@ -16,11 +16,11 @@
     
     @Override
     protected String getFieldParameterName() {
-        return "iteration_fields";
+        return "iteration_result_fields";
     }
 
     @Override
     public String getBaseSqlName() {
-        return "iteration_";
+        return "iteration_result_";
     }
 }
--- /dev/null   2009-12-17 12:29:38.000000000 -0800
+++ autotest/frontend/client/src/autotest/tko/JobKeyvalField.java       
2010-03-26 13:03:30.000000000 -0700
@@ -0,0 +1,26 @@
+package autotest.tko;
+
+
+public class JobKeyvalField extends AttributeField {
+    public static final String TYPE_NAME = "Job Keyval";
+
+    @Override
+    protected ParameterizedField freshInstance() {
+        return new JobKeyvalField();
+    }
+
+    @Override
+    public String getTypeName() {
+        return TYPE_NAME;
+    }
+    
+    @Override
+    protected String getFieldParameterName() {
+        return "job_keyval_fields";
+    }
+
+    @Override
+    public String getBaseSqlName() {
+        return "job_keyval_";
+    }
+}
--- autotest/frontend/client/src/autotest/tko/ParameterizedField.java   
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/ParameterizedField.java   
2010-03-26 13:03:30.000000000 -0700
@@ -43,6 +43,8 @@
         new IterationResultField(),
         new TestAttributeField(),
         new TestLabelField(),
+        new JobKeyvalField(),
+        new IterationAttributeField(),
     };
     
     private static final List<String> prototypeNames = new ArrayList<String>();
--- autotest/frontend/client/src/autotest/tko/TestAttributeField.java   
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/TestAttributeField.java   
2010-03-26 13:03:30.000000000 -0700
@@ -21,6 +21,6 @@
 
     @Override
     public String getBaseSqlName() {
-        return "attribute_";
+        return "test_attribute_";
     }
 }
--- autotest/frontend/client/src/autotest/tko/TestLabelField.java       
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/TestLabelField.java       
2010-03-26 13:03:30.000000000 -0700
@@ -10,7 +10,7 @@
 
     @Override
     protected String getBaseSqlName() {
-        return "label_";
+        return "test_label_";
     }
 
     @Override
--- autotest/frontend/tko/models.py     2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/tko/models.py     2010-03-26 13:03:30.000000000 -0700
@@ -140,7 +140,7 @@
         db_table = 'tko_status'
 
 
-class Job(dbmodels.Model):
+class Job(dbmodels.Model, model_logic.ModelExtensions):
     job_idx = dbmodels.AutoField(primary_key=True)
     tag = dbmodels.CharField(unique=True, max_length=100)
     label = dbmodels.CharField(max_length=300)
@@ -151,6 +151,8 @@
     finished_time = dbmodels.DateTimeField(null=True, blank=True)
     afe_job_id = dbmodels.IntegerField(null=True, default=None)
 
+    objects = model_logic.ExtendedManager()
+
     class Meta:
         db_table = 'tko_jobs'
 
@@ -371,8 +373,8 @@
         return self._add_custom_select(query_set, alias, select_sql)
 
 
-    def _join_label_column(self, query_set, label_name, label_id):
-        alias = 'label_' + label_name
+    def _join_test_label_column(self, query_set, label_name, label_id):
+        alias = 'test_label_' + label_name
         label_query = TestLabel.objects.filter(name=label_name)
         query_set = Test.objects.join_custom_field(query_set, label_query,
                                                    alias)
@@ -381,23 +383,23 @@
         return query_set
 
 
-    def _join_label_columns(self, query_set, label_names):
+    def _join_test_label_columns(self, query_set, label_names):
         label_id_map = self._get_label_ids_from_names(label_names)
         for label_name in label_names:
-            query_set = self._join_label_column(query_set, label_name,
-                                                label_id_map[label_name])
+            query_set = self._join_test_label_column(query_set, label_name,
+                                                     label_id_map[label_name])
         return query_set
 
 
-    def _join_attribute(self, query_set, attribute, alias=None,
-                        extra_join_condition=None):
+    def _join_test_attribute(self, query_set, attribute, alias=None,
+                             extra_join_condition=None):
         """
         Join the given TestView QuerySet to TestAttribute.  The resulting query
         has an additional column for the given attribute named
         "attribute_<attribute name>".
         """
         if not alias:
-            alias = 'attribute_' + attribute
+            alias = 'test_attribute_' + attribute
         attribute_query = TestAttribute.objects.filter(attribute=attribute)
         if extra_join_condition:
             attribute_query = attribute_query.extra(
@@ -414,15 +416,15 @@
             alias = 'machine_label_' + label_name
             condition = "FIND_IN_SET('%s', %s)" % (
                     label_name, _quote_name(alias) + '.value')
-            query_set = self._join_attribute(query_set, 'host-labels',
-                                             alias=alias,
-                                             extra_join_condition=condition)
+            query_set = self._join_test_attribute(
+                    query_set, 'host-labels',
+                    alias=alias, extra_join_condition=condition)
             query_set = self._add_select_ifnull(query_set, alias, label_name)
         return query_set
 
 
     def _join_one_iteration_key(self, query_set, result_key, first_alias=None):
-        alias = 'iteration_' + result_key
+        alias = 'iteration_result_' + result_key
         iteration_query = IterationResult.objects.filter(attribute=result_key)
         if first_alias:
             # after the first join, we need to match up iteration indices,
@@ -445,7 +447,7 @@
         return query_set, alias
 
 
-    def _join_iterations(self, test_view_query_set, result_keys):
+    def _join_iteration_results(self, test_view_query_set, result_keys):
         """Join the given TestView QuerySet to IterationResult for one result.
 
         The resulting query looks like a TestView query but has one row per
@@ -473,6 +475,27 @@
         return query_set
 
 
+    def _join_job_keyvals(self, query_set, job_keyvals):
+        for job_keyval in job_keyvals:
+            alias = 'job_keyval_' + job_keyval
+            keyval_query = JobKeyval.objects.filter(key=job_keyval)
+            query_set = Job.objects.join_custom_field(query_set, keyval_query,
+                                                       alias)
+            query_set = self._add_select_value(query_set, alias)
+        return query_set
+
+
+    def _join_iteration_attributes(self, query_set, iteration_attributes):
+        for attribute in iteration_attributes:
+            alias = 'iteration_attribute_' + attribute
+            attribute_query = IterationAttribute.objects.filter(
+                    attribute=attribute)
+            query_set = Test.objects.join_custom_field(query_set,
+                                                       attribute_query, alias)
+            query_set = self._add_select_value(query_set, alias)
+        return query_set
+
+
     def get_query_set_with_joins(self, filter_data):
         """
         Add joins for querying over test-related items.
@@ -482,7 +505,7 @@
                 be available as a column attribute_<name>.value.
         * test_label_fields: list of label names.  Each label will be available
                 as a column label_<name>.id, non-null iff the label is present.
-        * iteration_fields: list of iteration result names.  Each
+        * iteration_result_fields: list of iteration result names.  Each
                 result will be available as a column iteration_<name>.value.
                 Note that this changes the semantics to return iterations
                 instead of tests -- if a test has multiple iterations, a row
@@ -491,6 +514,13 @@
         * machine_label_fields: list of machine label names.  Each will be
                 available as a column machine_label_<name>.id, non-null iff the
                 label is present on the machine used in the test.
+        * job_keyval_fields: list of job keyval names. Each value will be
+                available as a column job_keyval_<name>.id, non-null iff the
+                keyval is present in the AFE job.
+        * iteration_attribute_fields: list of iteration attribute names. Each
+                attribute will be available as a column
+                iteration_attribute<name>.id, non-null iff the attribute is
+                present.
 
         These parameters are deprecated:
         * include_labels
@@ -507,16 +537,23 @@
 
         test_attributes = filter_data.pop('test_attribute_fields', [])
         for attribute in test_attributes:
-            query_set = self._join_attribute(query_set, attribute)
+            query_set = self._join_test_attribute(query_set, attribute)
 
         test_labels = filter_data.pop('test_label_fields', [])
-        query_set = self._join_label_columns(query_set, test_labels)
+        query_set = self._join_test_label_columns(query_set, test_labels)
 
         machine_labels = filter_data.pop('machine_label_fields', [])
         query_set = self._join_machine_label_columns(query_set, machine_labels)
 
-        iteration_keys = filter_data.pop('iteration_fields', [])
-        query_set = self._join_iterations(query_set, iteration_keys)
+        iteration_keys = filter_data.pop('iteration_result_fields', [])
+        query_set = self._join_iteration_results(query_set, iteration_keys)
+
+        job_keyvals = filter_data.pop('job_keyval_fields', [])
+        query_set = self._join_job_keyvals(query_set, job_keyvals)
+
+        iteration_attributes = filter_data.pop('iteration_attribute_fields', 
[])
+        query_set = self._join_iteration_attributes(query_set,
+                                                    iteration_attributes)
 
         # everything that follows is deprecated behavior
 
--- autotest/frontend/tko/rpc_interface_unittest.py     2010-03-26 
13:03:30.000000000 -0700
+++ autotest/frontend/tko/rpc_interface_unittest.py     2010-03-26 
13:03:30.000000000 -0700
@@ -421,39 +421,39 @@
                 test_attribute_fields=['myattr', 'myattr2'])
         self.assertEquals(len(tests), 3)
 
-        self.assertEquals(tests[0]['attribute_myattr'], 'myval')
-        self.assertEquals(tests[0]['attribute_myattr2'], 'myval2')
+        self.assertEquals(tests[0]['test_attribute_myattr'], 'myval')
+        self.assertEquals(tests[0]['test_attribute_myattr2'], 'myval2')
 
         for index in (1, 2):
-            self.assertEquals(tests[index]['attribute_myattr'], None)
-            self.assertEquals(tests[index]['attribute_myattr2'], None)
+            self.assertEquals(tests[index]['test_attribute_myattr'], None)
+            self.assertEquals(tests[index]['test_attribute_myattr2'], None)
 
 
     def test_filtering_on_test_attribute_fields(self):
         tests = rpc_interface.get_test_views(
-                extra_where='attribute_myattr.value = "myval"',
+                extra_where='test_attribute_myattr.value = "myval"',
                 test_attribute_fields=['myattr'])
         self.assertEquals(len(tests), 1)
 
 
     def test_grouping_with_test_attribute_fields(self):
         num_groups = rpc_interface.get_num_groups(
-                ['attribute_myattr'], test_attribute_fields=['myattr'])
+                ['test_attribute_myattr'], test_attribute_fields=['myattr'])
         self.assertEquals(num_groups, 2)
 
         counts = rpc_interface.get_group_counts(
-                ['attribute_myattr'], test_attribute_fields=['myattr'])
+                ['test_attribute_myattr'], test_attribute_fields=['myattr'])
         groups = counts['groups']
         self.assertEquals(len(groups), num_groups)
-        self.assertEquals(groups[0]['attribute_myattr'], None)
+        self.assertEquals(groups[0]['test_attribute_myattr'], None)
         self.assertEquals(groups[0]['group_count'], 2)
-        self.assertEquals(groups[1]['attribute_myattr'], 'myval')
+        self.assertEquals(groups[1]['test_attribute_myattr'], 'myval')
         self.assertEquals(groups[1]['group_count'], 1)
 
 
     def test_extra_info_test_attributes(self):
         counts = rpc_interface.get_latest_tests(
-                group_by=['test_idx'], extra_info=['attribute_myattr'],
+                group_by=['test_idx'], extra_info=['test_attribute_myattr'],
                 test_attribute_fields=['myattr'])
         group1 = counts['groups'][0]
         self.assertEquals(group1['extra_info'], ['myval'])
@@ -464,76 +464,78 @@
                 test_label_fields=['testlabel1', 'testlabel2'])
         self.assertEquals(len(tests), 3)
 
-        self.assertEquals(tests[0]['label_testlabel1'], 'testlabel1')
-        self.assertEquals(tests[0]['label_testlabel2'], 'testlabel2')
+        self.assertEquals(tests[0]['test_label_testlabel1'], 'testlabel1')
+        self.assertEquals(tests[0]['test_label_testlabel2'], 'testlabel2')
 
         for index in (1, 2):
-            self.assertEquals(tests[index]['label_testlabel1'], None)
-            self.assertEquals(tests[index]['label_testlabel2'], None)
+            self.assertEquals(tests[index]['test_label_testlabel1'], None)
+            self.assertEquals(tests[index]['test_label_testlabel2'], None)
 
 
     def test_filtering_on_test_label_fields(self):
         tests = rpc_interface.get_test_views(
-                extra_where='label_testlabel1 = "testlabel1"',
+                extra_where='test_label_testlabel1 = "testlabel1"',
                 test_label_fields=['testlabel1'])
         self.assertEquals(len(tests), 1)
 
 
     def test_grouping_on_test_label_fields(self):
         num_groups = rpc_interface.get_num_groups(
-                ['label_testlabel1'], test_label_fields=['testlabel1'])
+                ['test_label_testlabel1'], test_label_fields=['testlabel1'])
         self.assertEquals(num_groups, 2)
 
         counts = rpc_interface.get_group_counts(
-                ['label_testlabel1'], test_label_fields=['testlabel1'])
+                ['test_label_testlabel1'], test_label_fields=['testlabel1'])
         groups = counts['groups']
         self.assertEquals(len(groups), 2)
-        self.assertEquals(groups[0]['label_testlabel1'], None)
+        self.assertEquals(groups[0]['test_label_testlabel1'], None)
         self.assertEquals(groups[0]['group_count'], 2)
-        self.assertEquals(groups[1]['label_testlabel1'], 'testlabel1')
+        self.assertEquals(groups[1]['test_label_testlabel1'], 'testlabel1')
         self.assertEquals(groups[1]['group_count'], 1)
 
 
-    def test_get_iteration_fields(self):
+    def test_get_iteration_result_fields(self):
         num_iterations = rpc_interface.get_num_test_views(
-                iteration_fields=['iresult', 'iresult2'])
+                iteration_result_fields=['iresult', 'iresult2'])
         self.assertEquals(num_iterations, 2)
 
         iterations = rpc_interface.get_test_views(
-                iteration_fields=['iresult', 'iresult2'])
+                iteration_result_fields=['iresult', 'iresult2'])
         self.assertEquals(len(iterations), 2)
 
         for index in (0, 1):
             self.assertEquals(iterations[index]['test_idx'], 1)
 
         self.assertEquals(iterations[0]['iteration_index'], 1)
-        self.assertEquals(iterations[0]['iteration_iresult'], 1)
-        self.assertEquals(iterations[0]['iteration_iresult2'], 2)
+        self.assertEquals(iterations[0]['iteration_result_iresult'], 1)
+        self.assertEquals(iterations[0]['iteration_result_iresult2'], 2)
 
         self.assertEquals(iterations[1]['iteration_index'], 2)
-        self.assertEquals(iterations[1]['iteration_iresult'], 3)
-        self.assertEquals(iterations[1]['iteration_iresult2'], 4)
+        self.assertEquals(iterations[1]['iteration_result_iresult'], 3)
+        self.assertEquals(iterations[1]['iteration_result_iresult2'], 4)
 
 
-    def test_filtering_on_iteration_fields(self):
+    def test_filtering_on_iteration_result_fields(self):
         iterations = rpc_interface.get_test_views(
-                extra_where='iteration_iresult.value = 1',
-                iteration_fields=['iresult'])
+                extra_where='iteration_result_iresult.value = 1',
+                iteration_result_fields=['iresult'])
         self.assertEquals(len(iterations), 1)
 
 
-    def test_grouping_with_iteration_fields(self):
-        num_groups = rpc_interface.get_num_groups(['iteration_iresult'],
-                                                  iteration_fields=['iresult'])
+    def test_grouping_with_iteration_result_fields(self):
+        num_groups = rpc_interface.get_num_groups(
+                ['iteration_result_iresult'],
+                iteration_result_fields=['iresult'])
         self.assertEquals(num_groups, 2)
 
-        counts = rpc_interface.get_group_counts(['iteration_iresult'],
-                                                iteration_fields=['iresult'])
+        counts = rpc_interface.get_group_counts(
+                ['iteration_result_iresult'],
+                iteration_result_fields=['iresult'])
         groups = counts['groups']
         self.assertEquals(len(groups), 2)
-        self.assertEquals(groups[0]['iteration_iresult'], 1)
+        self.assertEquals(groups[0]['iteration_result_iresult'], 1)
         self.assertEquals(groups[0]['group_count'], 1)
-        self.assertEquals(groups[1]['iteration_iresult'], 3)
+        self.assertEquals(groups[1]['iteration_result_iresult'], 3)
         self.assertEquals(groups[1]['group_count'], 1)
 
 
@@ -584,12 +586,13 @@
         # ensure fields with special characters are properly quoted throughout
         rpc_interface.add_test_label('hyphen-label')
         rpc_interface.get_group_counts(
-                ['attribute_hyphen-attr', 'label_hyphen-label',
-                 'machine_label_hyphen-label', 'iteration_hyphen-result'],
+                ['test_attribute_hyphen-attr', 'test_label_hyphen-label',
+                 'machine_label_hyphen-label',
+                 'iteration_result_hyphen-result'],
                 test_attribute_fields=['hyphen-attr'],
                 test_label_fields=['hyphen-label'],
                 machine_label_fields=['hyphen-label'],
-                iteration_fields=['hyphen-result'])
+                iteration_result_fields=['hyphen-result'])
 
 
 if __name__ == '__main__':
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to