• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package autotest.tko;
2 
3 import autotest.common.Utils;
4 import autotest.common.ui.MultiListSelectPresenter.Item;
5 
6 import com.google.gwt.json.client.JSONObject;
7 
8 /**
9  * A field associated with test results.  The user may
10  * * view this field in table view,
11  * * sort by this field in table view,
12  * * group by this field in spreadsheet or table view, and
13  * * filter on this field in the SQL condition.
14  * It's assumed that the name returned by getSqlName() is a field returned by the server which may
15  * also be used for grouping and sorting.  Filtering, however, is done separately (through
16  * getSqlCondition()), so HeaderFields may generate arbitrary SQL to perform filtering.
17  * HeaderFields may also add arbitrary query arguments to support themselves.
18  *
19  * While the set of HeaderFields active in the application may change at runtime, HeaderField
20  * objects themselves are immutable.
21  */
22 public abstract class HeaderField implements Comparable<HeaderField> {
23     protected String name;
24     protected String sqlName;
25 
26     /**
27      * @param name Display name for this field (i.e. "Job name")
28      * @param sqlName SQL field name (i.e. "job_name")
29      */
HeaderField(String name, String sqlName)30     protected HeaderField(String name, String sqlName) {
31         this.name = name;
32         this.sqlName = sqlName;
33     }
34 
compareTo(HeaderField other)35     public int compareTo(HeaderField other) {
36         return name.compareTo(other.name);
37     }
38 
39     /**
40      * A common helper for SQL conditions.
41      */
getSimpleSqlCondition(String field, String value)42     protected String getSimpleSqlCondition(String field, String value) {
43         if (value.equals(Utils.JSON_NULL)) {
44           return field + " is null";
45         } else {
46           return field + " = '" + TkoUtils.escapeSqlValue(value) + "'";
47         }
48     }
49 
50     /**
51      * Get the SQL WHERE clause to filter on the given value for this header.
52      */
getSqlCondition(String value)53     public abstract String getSqlCondition(String value);
54 
55     /**
56      * Get the name of this field.
57      */
getName()58     public String getName() {
59         return name;
60     }
61 
62     /**
63      * Get the name to use for this field in a SQL select.
64      */
getSqlName()65     public String getSqlName() {
66         return sqlName;
67     }
68 
69     /**
70      * Get a quoted version of getSqlName() safe for use directly in SQL.
71      */
getQuotedSqlName()72     public String getQuotedSqlName() {
73         String sqlName = getSqlName();
74         if (sqlName.matches(".+\\(.+\\)")) {
75             // don't quote fields involving SQL functions
76             return sqlName;
77         }
78         return "`" + sqlName + "`";
79     }
80 
81     @Override
toString()82     public String toString() {
83         return "HeaderField<" + getName() + ", " + getSqlName() + ">";
84     }
85 
86     /**
87      * Should this field be provided as a choice for the user to select?
88      */
isUserSelectable()89     public boolean isUserSelectable() {
90         return true;
91     }
92 
93     /**
94      * @return a MultiListSelectPresenter.Item for this HeaderField.
95      */
getItem()96     public Item getItem() {
97         return Item.createItem(getName(), getSqlName());
98     }
99 
100     /**
101      * Add necessary parameters to an RPC request to select this field.  Does nothing by default.
102      * @param parameters query parameters
103      */
addQueryParameters(JSONObject parameters)104     public void addQueryParameters(JSONObject parameters) {}
105 }
106