0001 function varargout = timespan(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 ALGONAME = mfilename;
0036 VERSION = '$Id: timespan.m,v 1.17 2008/02/24 10:15:55 hewitson Exp $';
0037 CATEGORY = 'Constructor';
0038
0039
0040 if (nargin == 2 || nargin == 3)
0041 if isa(varargin{1}, 'timespan') && ischar(varargin{2})
0042 in = char(varargin{2});
0043 if strcmp(in, 'Params')
0044 if nargin == 2
0045 varargout{1} = getDefaultPlist();
0046 else
0047 varargout{1} = getDefaultPlist(varargin{3});
0048 end
0049 return
0050 elseif strcmp(in, 'Version')
0051 varargout{1} = VERSION;
0052 return
0053 elseif strcmp(in, 'Category')
0054 varargout{1} = CATEGORY;
0055 return
0056 end
0057 end
0058 end
0059
0060
0061
0062 function t_span = init
0063 t_span.name = 'time span-object';
0064 t_span.start = time();
0065 t_span.end = time();
0066 t_span.timeformat = t_span.start.timeformat;
0067 t_span.interval = '';
0068 t_span.timezone = t_span.start.timezone;
0069 t_span.created = time();
0070 t_span.version = VERSION;
0071 t_span.plist = plist;
0072 t_span = class (t_span, 'timespan');
0073 end
0074
0075
0076
0077
0078 if nargin == 0
0079
0080 t_span = init;
0081
0082 elseif nargin == 1
0083
0084
0085 if isa(varargin{1}, 'timespan')
0086
0087 t_span = varargin{1};
0088
0089
0090
0091 elseif ischar(varargin{1})
0092
0093 filename = varargin{1};
0094 [path, name, ext, vers] = fileparts(filename);
0095 switch ext
0096 case '.mat'
0097 t_span = load(filename);
0098 t_span = t_span.a;
0099 case '.xml'
0100 root_node = xmlread(filename);
0101 t_span = ltpda_xmlread(root_node, 'timespan');
0102 otherwise
0103 error('### Unknown file type.');
0104 end
0105
0106 varargout{1} = t_span;
0107
0108
0109 elseif isa(varargin{1}, 'plist')
0110
0111 pl_start = find(varargin{1}, 'start');
0112 pl_end = find(varargin{1}, 'end');
0113 pl_timezone = find(varargin{1}, 'timezone');
0114 pl_timeformat = find(varargin{1}, 'timeformat');
0115 hostname = find(varargin{1}, 'hostname');
0116
0117 if ~isempty(hostname)
0118 t_span = timespanFromRepository(varargin{1}, VERSION, ALGONAME);
0119 else
0120 if isempty(pl_start) || isempty(pl_end)
0121 error('### The plist must contain the keys: ''start'' and ''end''');
0122 end
0123
0124 t_span = init();
0125
0126 if ~isempty(pl_timeformat)
0127 format_nr = str2double(pl_timeformat);
0128 if isnumeric(format_nr) && ~isnan(format_nr)
0129 t_span = set(t_span, 'timeformat', format_nr);
0130 else
0131 t_span = set(t_span, 'timeformat', pl_timeformat);
0132 end
0133 end
0134
0135 if ~isempty(pl_timezone)
0136 t_span = set(t_span, 'timezone', pl_timezone);
0137 end
0138
0139 t_span = set(t_span, 'start', pl_start);
0140 t_span = set(t_span, 'end', pl_end);
0141 end
0142
0143
0144 t_span.plist = remove(varargin{1}, 'conn');
0145
0146
0147 elseif isstruct(varargin{1})
0148
0149 t_span = init();
0150
0151 fields = fieldnames(varargin{1});
0152 for ii = 1:length(fields)
0153 field = fields{ii};
0154
0155 if strcmp(field, 'start')
0156 start_t = varargin{1}.start;
0157 if isstruct(start_t)
0158 start_t = time(start_t);
0159 end
0160 t_span.start = start_t;
0161
0162 elseif strcmp(field, 'end')
0163 end_t = varargin{1}.end;
0164 if isstruct(end_t)
0165 end_t = time(end_t);
0166 end
0167 t_span.end = end_t;
0168
0169 elseif strcmp(field, 'timeformat')
0170 tf = varargin{1}.timeformat;
0171 if isstruct(tf)
0172 tf = timeformat(tf);
0173 end
0174 t_span.timeformat = tf;
0175
0176 else
0177 try
0178 t_span.(field) = varargin{1}.(field);
0179 catch
0180 error('### The field ''%s'' in the struct is not a timespan property.', field)
0181 end
0182 end
0183 end
0184
0185 varargout{1} = t_span;
0186
0187 else
0188 error ('### Unknown constructor');
0189 end
0190
0191 elseif nargin == 2
0192
0193
0194 if ischar(varargin{1}) && ischar(varargin{2})
0195
0196 t_span = init;
0197 t_span.start = time(varargin{1});
0198 t_span.end = time(varargin{2});
0199
0200
0201 t_span = set(t_span, 'timeformat', t_span.start.timeformat);
0202 t_span = set(t_span, 'timezone', t_span.start.timezone);
0203
0204
0205 t_span = compute_interval(t_span);
0206
0207
0208 elseif isa(varargin{1}, 'database')
0209
0210 t_span = retrieve(varargin{1}, varargin{2:end});
0211
0212
0213 elseif isa(varargin{1}, 'time') && isa(varargin{2}, 'time')
0214
0215 t_span = init;
0216 t_span.start = varargin{1};
0217 t_span.end = varargin{2};
0218
0219
0220 t_span = set(t_span, 'timeformat', t_span.start.timeformat);
0221 t_span = set(t_span, 'timezone', t_span.start.timezone);
0222
0223
0224 t_span = compute_interval(t_span);
0225
0226
0227 elseif isa(varargin{1}, 'time') && ischar(varargin{2})
0228
0229 t_span = init;
0230 t_span.start = varargin{1};
0231 t_span.end = time(varargin{2}, char(t_span.start.timeformat));
0232
0233
0234 t_span = set(t_span, 'timeformat', t_span.start.timeformat);
0235 t_span = set(t_span, 'timezone', t_span.start.timezone);
0236
0237
0238 t_span = compute_interval(t_span);
0239
0240
0241 elseif ischar(varargin{1}) && isa(varargin{2}, 'time')
0242
0243 t_span = init;
0244 t_span.end = varargin{2};
0245 t_span.start = time(varargin{1}, char(t_span.end.timeformat));
0246
0247
0248 t_span = set(t_span, 'timeformat', t_span.start.timeformat);
0249 t_span = set(t_span, 'timezone', t_span.start.timezone);
0250
0251
0252 t_span = compute_interval(t_span);
0253
0254 else
0255 error (' ### Unknown constructor.');
0256
0257 end
0258
0259 elseif nargin == 3
0260
0261
0262 if ischar(varargin{1}) && ischar(varargin{2}) && ischar(varargin{3})
0263
0264 t_span = init;
0265 t_span.start = time(varargin{1}, varargin{3});
0266 t_span.end = time(varargin{2}, varargin{3});
0267 t_span.timeformat = t_span.start.timeformat;
0268
0269
0270 t_span = compute_interval(t_span);
0271
0272 elseif isa(varargin{1}, 'time') && isa(varargin{2}, 'time') && isa(varargin{3}, 'timeformat')
0273
0274 t_span = init;
0275 t_span.start = varargin{1};
0276 t_span.end = varargin{2};
0277 t_span.timeformat = varargin{3};
0278
0279 t_span.start = set(t_span.start, 'timeformat', t_span.timeformat);
0280 t_span.end = set(t_span.end, 'timeformat', t_span.timeformat);
0281
0282
0283 t_span = compute_interval(t_span);
0284
0285 else
0286 error (' ### Unknown constructor.');
0287
0288 end
0289
0290 else
0291
0292 error ('### Unknown number of inputs');
0293
0294 end
0295
0296
0297 if t_span.start.utc_epoch_milli > t_span.end.utc_epoch_milli
0298 error('### The start time is larger than the end time.');
0299 end
0300
0301 varargout{1} = t_span;
0302
0303
0304
0305
0306 function fs = timespanFromRepository(pl, VERSION, ALGONAME)
0307
0308 dpl = getDefaultPlist('From Repository');
0309 pl = combine(pl, dpl);
0310
0311
0312 conn = find(pl, 'conn');
0313 hostname = find(pl, 'hostname');
0314 database = find(pl, 'database');
0315 ids = find(pl, 'id');
0316
0317
0318 closeConn = 0;
0319 if isempty(conn)
0320 closeConn = 1;
0321
0322 conn = mysql_connect(hostname, database);
0323 end
0324 if ~isa(conn, 'database')
0325 error('### connection failed.');
0326 end
0327
0328
0329 Nids = length(ids);
0330 fs = [];
0331 for kk=1:Nids
0332
0333
0334 id = ids(kk);
0335 disp(sprintf(' - retrieving ID %d', id));
0336
0337
0338 tt = mysql_getObjType(conn, id);
0339
0340 if strcmp(tt, mfilename)
0341
0342 a = ltpda_obj_retrieve(conn, id);
0343
0344
0345 fs = [fs a];
0346 else
0347 warning(' !skipping ID %d, type %s', id, tt);
0348 end
0349
0350 end
0351
0352
0353 if closeConn
0354 close(conn);
0355 end
0356
0357 end
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369 function out = getDefaultPlist(varargin)
0370
0371
0372 sets = {'From Timespan Definition', 'From Repository'};
0373
0374 if nargin == 0
0375 out = sets;
0376 return
0377 end
0378
0379 set = varargin{1};
0380 switch set
0381 case 'From Repository'
0382 out = plist('hostname', 'localhost', 'database', 'ltpda', 'ID', []);
0383 case 'From Timespan Definition'
0384 out = plist('start', '1970-01-01 00:30:00.000', ...
0385 'end', '1980-01-01 12:00:00.010', ...
0386 'timezone', 'UTC', ...
0387 'timeformat', 'yyyy-mm-dd HH:MM:SS.FFF');
0388 otherwise
0389 out = plist();
0390 end
0391
0392 end
0393
0394
0395 end