# This is a date_filter plug-in. # START is the beginning of the first part of the range; end is the end of the last part of the range range = { label = "range" usage = "X-Y" regular_expression = "^([^-]+)-([^-]+)$" start = ` string rangestart = $1; string range = $1 . "-" . $2; #echo("Matched range; range=" . range); # Allow a divider surrounding the - in the range if (matches_regular_expression(rangestart, '^(.*)[^-,0-9A-Za-z]$')) then rangestart = $1; #error('x'); # Save the range start, so we can use it from the end if we need to. v.date_filter_range_start = rangestart; #v.start_of_range = true; # Compute the start of the range recursively #v.decomposition = ''; #node outerdecomposition = clone_node('v'{'decomposition'}); #echo("saved outerdecomposition: " . node_as_string(outerdecomposition)); #delete_node('v.decomposition'); #if (?'v.decomposition_start') then # delete_node('v.decomposition_start'); #if (?'v.decomposition_end') then # delete_node('v.decomposition_end'); #@'v'{'decomposition'}{'range'} = range; node dfi = new_node(); get_date_filter_info(rangestart, dfi, true, v.earliest_log_date, v.latest_log_date); #echo("sub dfi for start '" . rangestart . "': " . node_as_string(dfi)); string earliest_relative_date = @dfi{'earliest_relative_date'}; delete_node(dfi); # Copy the decomposition for this over to decomposition_start, but only if there isn't a decomposition_start already. # If there is, it means that our own rangestart was itself a range, and we should use whatever it computed to be decomposition_start # (necessary in cases like q1/2012-Nov2012, where rangestart=q1/2012, and expands to Jan2012-Mar2012, and populates Jan2012 into decomposition_start; # in that case we need to keep that in decomposition_start, not overwrite it with our own decomposition from the outer range (q1 2012)). #if (!?'v.decomposition_start') then clone_node('v.decomposition', 'v'{'this'}{range}{'decomposition_start'}); #echo("start: " . node_as_string('v.decomposition_start')); #@'v.decomposition'{'range'} = outerrange; #clone_node(outerdecomposition, 'v.decomposition'); earliest_relative_date; ` end = ` string range = $1 . "-" . $2; string rangeend = $2; #v.end_of_range = true; # Allow a divider surrounding the - in the range if (matches_regular_expression(rangeend, '^[^-,0-9A-Za-z](.*)$')) then rangeend = $1; # Compute the end of the range recursively node dfi = new_node(); #node decomposition_start_clone = clone_node('v'{'decomposition_start'}); #node decomposition_end_clone = clone_node('v'{'decomposition_end'}); #node outerdecomposition = clone_node('v'{'decomposition'}); #echo("saved outerdecomposition: " . node_as_string(outerdecomposition)); #delete_node('v.decomposition'); get_date_filter_info(rangeend, dfi, true, v.earliest_log_date, v.latest_log_date); #echo("sub dfi for end '" . rangeend . "': " . node_as_string(dfi)); string latest_relative_date = @dfi{'latest_relative_date'}; delete_node(dfi); #clone_node(decomposition_start_clone, 'v'{'decomposition_start'}); #clone_node(decomposition_end_clone, 'v'{'decomposition_end'}); #delete_node('v.decomposition'); #if (?'v.decomposition') then if (!?'v.decomposition_end') then #echo("2Copying v.decomposition to v.decomposition_end: " . node_as_string('v.decomposition')); clone_node('v.decomposition', 'v'{'this'}{range}{'decomposition_end'}); # clone_node('v.decomposition', 'v.decomposition_end'{range}); #delete_node('v.decomposition'); #echo("MERGING decompositions; START=" . node_as_string('v'{'this'}{range}{'decomposition_start'}) . "END=" . node_as_string('v'{'this'}{range}{'decomposition_end'}) . # "WITH EXISTING START=" . (if (?'v.decomposition_start') then node_as_string('v'{'decomposition_start'}) else 'NONE') . # 'END=' . (if (?'v.decomposition_end') then node_as_string('v'{'decomposition_end'}) else 'NONE')); # This converts a decomposition node d to epoc format, returning the epoc of the start of the range if rangestart=true, or the end otherwise subroutine(decomposition_to_epoc(node d, bool rangestart), ( # echo("decomposition_to_epoc(); d=" . node_as_string(d)); string date; date = @d{'year'}; if (d?{'month'}) then date .= '-' . @d{'month'}; else if (d?{'quarter'}) then ( if (rangestart) then date .= '-' . @'templates.util.date_filter.quarters_to_months'{@d{'quarter'}}{'start'}; else date .= '-' . @'templates.util.date_filter.quarters_to_months'{@d{'quarter'}}{'end'}; ); else date .= '-1'; if (d?{'day'}) then date .= '-' . @d{'day'}; else date .= '-1'; #echo("date: " . date); string normalized_date = normalize_date(date, 'auto'); # echo("normalized_date=" . normalized_date); int epoc = date_time_to_epoc(normalized_date . " 00:00:00"); # echo("epoc: " . epoc); epoc; )); # Update v.decomposition_start and v.decomposition_end from the start and end decompositions of this range if (!?'v.decomposition_start') then clone_node('v'{'this'}{range}{'decomposition_start'}, 'v'{'decomposition_start'}); else if (decomposition_to_epoc('v'{'this'}{range}{'decomposition_start'}, true) < decomposition_to_epoc('v'{'decomposition_start'}, true)) then clone_node('v'{'this'}{range}{'decomposition_start'}, 'v'{'decomposition_start'}); if (!?'v.decomposition_end') then clone_node('v'{'this'}{range}{'decomposition_end'}, 'v'{'decomposition_end'}); else if (decomposition_to_epoc('v'{'this'}{range}{'decomposition_end'}, false) > decomposition_to_epoc('v'{'decomposition_end'}, false)) then clone_node('v'{'this'}{range}{'decomposition_end'}, 'v'{'decomposition_end'}); #echo("MERGE RESULTS: " . node_as_string('v'{'decomposition_start'}) . "" . node_as_string('v'{'decomposition_end'})); #echo("end: " . node_as_string('v.decomposition_end')); #clone_node(outerdecomposition, 'v.decomposition'); latest_relative_date; ` }