add "first word" support -- use for callnumber prefix
[Evergreen.git] / Open-ILS / web / reports / xul / transforms.js
1 var OILS_RPT_DTYPE_STRING = 'text';
2 var OILS_RPT_DTYPE_MONEY = 'money';
3 var OILS_RPT_DTYPE_BOOL = 'bool';
4 var OILS_RPT_DTYPE_INT = 'int';
5 var OILS_RPT_DTYPE_ID = 'id';
6 var OILS_RPT_DTYPE_OU = 'org_unit';
7 var OILS_RPT_DTYPE_FLOAT = 'float';
8 var OILS_RPT_DTYPE_TIMESTAMP = 'timestamp';
9 var OILS_RPT_DTYPE_INTERVAL = 'interval';
10 var OILS_RPT_DTYPE_LINK = 'link';
11 var OILS_RPT_DTYPE_NONE = '';
12 var OILS_RPT_DTYPE_NULL = null;
13 var OILS_RPT_DTYPE_UNDEF;
14
15 var OILS_RPT_DTYPE_ALL = [
16         OILS_RPT_DTYPE_STRING,
17         OILS_RPT_DTYPE_MONEY,
18         OILS_RPT_DTYPE_INT,
19         OILS_RPT_DTYPE_ID,
20         OILS_RPT_DTYPE_FLOAT,
21         OILS_RPT_DTYPE_TIMESTAMP,
22         OILS_RPT_DTYPE_BOOL,
23         OILS_RPT_DTYPE_OU,
24         OILS_RPT_DTYPE_NONE,
25         OILS_RPT_DTYPE_NULL,
26         OILS_RPT_DTYPE_UNDEF,
27         OILS_RPT_DTYPE_INTERVAL,
28         OILS_RPT_DTYPE_LINK
29 ];
30 var OILS_RPT_DTYPE_NOT_ID = [OILS_RPT_DTYPE_STRING,OILS_RPT_DTYPE_MONEY,OILS_RPT_DTYPE_INT,OILS_RPT_DTYPE_FLOAT,OILS_RPT_DTYPE_TIMESTAMP];
31 var OILS_RPT_DTYPE_NOT_BOOL = [OILS_RPT_DTYPE_STRING,OILS_RPT_DTYPE_MONEY,OILS_RPT_DTYPE_INT,OILS_RPT_DTYPE_FLOAT,OILS_RPT_DTYPE_TIMESTAMP,OILS_RPT_DTYPE_ID];
32
33 var OILS_RPT_TRANSFORMS = {
34         Bare : {
35                 datatype : OILS_RPT_DTYPE_ALL,
36                 label : 'Raw Data'
37         },
38
39         first : {
40                 datatype : OILS_RPT_DTYPE_NOT_ID,
41                 label : 'First Value'
42         },
43
44         last : {
45                 datatype : OILS_RPT_DTYPE_NOT_ID,
46                 label : 'Last Value'
47         },
48
49         count : {
50                 datatype : OILS_RPT_DTYPE_NOT_BOOL,
51                 aggregate : true,
52                 label :  'Count'
53         },
54
55         count_distinct : {
56                 datatype : OILS_RPT_DTYPE_NOT_BOOL,
57                 aggregate : true,
58                 label : 'Count Distinct'
59         },
60
61         min : {
62                 datatype : OILS_RPT_DTYPE_NOT_ID,
63                 aggregate : true,
64                 label : 'Min'
65         },
66
67         max : {
68                 datatype : OILS_RPT_DTYPE_NOT_ID,
69                 aggregate : true,
70                 label : 'Max'
71         },
72
73         /* string transforms ------------------------- */
74
75         substring : {
76                 datatype : [ OILS_RPT_DTYPE_STRING ],
77                 params : 2,
78                 label : 'Substring'
79         },
80
81         lower : {
82                 datatype : [ OILS_RPT_DTYPE_STRING ],
83                 label : 'Lower case'
84         },
85
86         upper : {
87                 datatype : [ OILS_RPT_DTYPE_STRING ],
88                 label : 'Upper case'
89         },
90
91         firt5 : {
92                 datatype : [ OILS_RPT_DTYPE_STRING ],
93                 label : 'First 5 characters (for US ZIP code)'
94         },
95
96         first_word : {
97                 datatype : [OILS_RPT_DTYPE_STRING, 'text'],
98                 label : 'First contiguous non-space string'
99         },
100
101         /* timestamp transforms ----------------------- */
102         dow : {
103                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
104                 label : 'Day of Week',
105                 cal_format : '%w',
106                 regex : /^[0-6]$/
107         },
108         dom : {
109                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
110                 label : 'Day of Month',
111                 cal_format : '%e',
112                 regex : /^[0-9]{1,2}$/
113         },
114
115         doy : {
116                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
117                 label : 'Day of Year',
118                 cal_format : '%j',
119                 regex : /^[0-9]{1,3}$/
120         },
121
122         woy : {
123                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
124                 label : 'Week of Year',
125                 cal_format : '%U',
126                 regex : /^[0-9]{1,2}$/
127         },
128
129         moy : {
130                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
131                 label : 'Month of Year',
132                 cal_format : '%m',
133                 regex : /^\d{1,2}$/
134         },
135
136         qoy : {
137                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
138                 label : 'Quarter of Year',
139                 regex : /^[1234]$/
140         }, 
141
142         hod : {
143                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
144                 label : 'Hour of day',
145                 cal_format : '%H',
146                 regex : /^\d{1,2}$/
147         }, 
148
149         date : {
150                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
151                 label : 'Date',
152                 regex : /^\d{4}-\d{2}-\d{2}$/,
153                 hint  : 'YYYY-MM-DD',
154                 cal_format : '%Y-%m-%d',
155                 input_size : 10
156         },
157
158         month_trunc : {
159                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
160                 label : 'Year + Month',
161                 regex : /^\d{4}-\d{2}$/,
162                 hint  : 'YYYY-MM',
163                 cal_format : '%Y-%m',
164                 input_size : 7
165         },
166
167         year_trunc : {
168                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
169                 label : 'Year',
170                 regex : /^\d{4}$/,
171                 hint  : 'YYYY',
172                 cal_format : '%Y',
173                 input_size : 4
174         },
175
176         hour_trunc : {
177                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
178                 label : 'Hour',
179                 regex : /^\d{2}$/,
180                 hint  : 'HH',
181                 cal_format : '%Y-%m-$d %H',
182                 input_size : 2
183         },
184
185         day_name : {
186                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
187                 cal_format : '%A',
188                 label : 'Day Name'
189         }, 
190
191         month_name : {
192                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
193                 cal_format : '%B',
194                 label : 'Month Name'
195         },
196         age : {
197                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
198                 label : 'Age'
199         },
200
201         months_ago : {
202                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
203                 label : 'Months ago'
204         },
205
206         quarters_ago : {
207                 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
208                 label : 'Quarters ago'
209         },
210
211         /* int  / float transforms ----------------------------------- */
212         sum : {
213                 datatype : [ OILS_RPT_DTYPE_INT, OILS_RPT_DTYPE_FLOAT, OILS_RPT_DTYPE_MONEY ],
214                 label : 'Sum',
215                 aggregate : true
216         }, 
217
218         average : {
219                 datatype : [ OILS_RPT_DTYPE_INT, OILS_RPT_DTYPE_FLOAT, OILS_RPT_DTYPE_MONEY ],
220                 label : 'Average',
221                 aggregate : true
222         },
223
224         round : {
225                 datatype : [ OILS_RPT_DTYPE_INT, OILS_RPT_DTYPE_FLOAT ],
226                 label : 'Round',
227         },
228
229         'int' : {
230                 datatype : [ OILS_RPT_DTYPE_FLOAT ],
231                 label : 'Drop trailing decimals'
232         }
233 }
234
235 function getTransforms(args) {
236         var dtype = args.datatype;
237         var agg = args.aggregate;
238         var tforms = OILS_RPT_TRANSFORMS;
239         var nonagg = args.non_aggregate;
240
241         var keys = getKeys(OILS_RPT_TRANSFORMS)
242         var tforms = [];
243
244         for( var i = 0; i < keys.length; i++ ) {
245                 var key = keys[i];
246                 var obj = OILS_RPT_TRANSFORMS[key];
247                 if( agg && !nonagg && !obj.aggregate ) continue;
248                 if( !agg && nonagg && obj.aggregate ) continue;
249                 if( !dtype && obj.datatype.length > 0 ) continue;
250                 if( dtype && obj.datatype.length > 0 && transformIsForDatatype(key,dtype).length == 0 ) continue;
251                 tforms.push(key);
252         }
253
254         return tforms;
255 }
256
257
258 function transformIsForDatatype(tform, dtype) {
259         var obj = OILS_RPT_TRANSFORMS[tform];
260         return grep(function(d) { return (d == dtype) }, obj.datatype);
261 }
262
263