2008-07-14 21:54:50 +08:00
|
|
|
<?php
|
|
|
|
|
2017-10-17 03:16:33 +08:00
|
|
|
function getDateScale( $scales, $range, $minLines, $maxLines ) {
|
2018-04-21 01:10:38 +08:00
|
|
|
foreach ( $scales as $scale ) {
|
|
|
|
$align = isset($scale['align'])?$scale['align']:1;
|
|
|
|
$scaleRange = (int)($range/($scale['factor']*$align));
|
|
|
|
//echo "S:".$scale['name'].", A:$align, SR:$scaleRange<br>";
|
|
|
|
if ( $scaleRange >= $minLines ) {
|
|
|
|
$scale['range'] = $scaleRange;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( !isset($scale['range']) ) {
|
|
|
|
$scale['range'] = (int)($range/($scale['factor']*$align));
|
|
|
|
}
|
|
|
|
$scale['divisor'] = 1;
|
|
|
|
while ( ($scale['range']/$scale['divisor']) > $maxLines ) {
|
|
|
|
$scale['divisor']++;
|
|
|
|
}
|
|
|
|
$scale['lines'] = (int)($scale['range']/$scale['divisor']);
|
|
|
|
return( $scale );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
2017-10-17 03:16:33 +08:00
|
|
|
function getYScale( $range, $minLines, $maxLines ) {
|
2018-04-21 01:10:38 +08:00
|
|
|
$scale['range'] = $range;
|
|
|
|
$scale['divisor'] = 1;
|
|
|
|
while ( $scale['range']/$scale['divisor'] > $maxLines ) {
|
|
|
|
$scale['divisor']++;
|
|
|
|
}
|
|
|
|
$scale['lines'] = (int)(($scale['range']-1)/$scale['divisor'])+1;
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
return( $scale );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
2017-10-17 03:16:33 +08:00
|
|
|
function getSlotFrame( $slot ) {
|
2018-04-21 01:10:38 +08:00
|
|
|
$slotFrame = isset($slot['frame'])?$slot['frame']['FrameId']:1;
|
|
|
|
if ( false && $slotFrame ) {
|
|
|
|
$slotFrame -= $monitor['PreEventCount'];
|
|
|
|
if ( $slotFrame < 1 )
|
|
|
|
$slotFrame = 1;
|
|
|
|
}
|
|
|
|
return( $slotFrame );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
2017-10-17 03:16:33 +08:00
|
|
|
function parseFilterToTree( $filter ) {
|
2018-04-21 01:10:38 +08:00
|
|
|
if ( count($filter['terms']) <= 0 ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$terms = $filter['terms'];
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
$StorageArea = NULL;
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
$postfixExpr = array();
|
|
|
|
$postfixStack = array();
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
$priorities = array(
|
|
|
|
'<' => 1,
|
|
|
|
'<=' => 1,
|
|
|
|
'>' => 1,
|
|
|
|
'>=' => 1,
|
|
|
|
'=' => 2,
|
|
|
|
'!=' => 2,
|
|
|
|
'=~' => 2,
|
|
|
|
'!~' => 2,
|
|
|
|
'=[]' => 2,
|
|
|
|
'![]' => 2,
|
|
|
|
'and' => 3,
|
|
|
|
'or' => 4,
|
|
|
|
);
|
|
|
|
|
|
|
|
for ( $i = 0; $i <= count($terms); $i++ ) {
|
|
|
|
if ( !empty($terms[$i]['cnj']) ) {
|
|
|
|
while( true ) {
|
|
|
|
if ( !count($postfixStack) ) {
|
|
|
|
$postfixStack[] = array('type'=>'cnj', 'value'=>$terms[$i]['cnj'], 'sqlValue'=>$terms[$i]['cnj']);
|
|
|
|
break;
|
|
|
|
} elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
|
|
|
|
$postfixStack[] = array('type'=>'cnj', 'value'=>$terms[$i]['cnj'], 'sqlValue'=>$terms[$i]['cnj']);
|
|
|
|
break;
|
|
|
|
} elseif ( $priorities[$terms[$i]['cnj']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
|
|
|
|
$postfixStack[] = array('type'=>'cnj', 'value'=>$terms[$i]['cnj'], 'sqlValue'=>$terms[$i]['cnj']);
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
$postfixExpr[] = array_pop($postfixStack);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( !empty($terms[$i]['obr']) ) {
|
|
|
|
for ( $j = 0; $j < $terms[$i]['obr']; $j++ ) {
|
|
|
|
$postfixStack[] = array('type'=>'obr', 'value'=>$terms[$i]['obr']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( !empty($terms[$i]['attr']) ) {
|
|
|
|
$dtAttr = false;
|
|
|
|
switch ( $terms[$i]['attr']) {
|
|
|
|
case 'MonitorName':
|
|
|
|
$sqlValue = 'M.'.preg_replace( '/^Monitor/', '', $terms[$i]['attr']);
|
|
|
|
break;
|
|
|
|
case 'ServerId':
|
|
|
|
$sqlValue .= 'M.ServerId';
|
|
|
|
break;
|
|
|
|
case 'DateTime':
|
|
|
|
case 'StartDateTime':
|
|
|
|
$sqlValue = "E.StartTime";
|
|
|
|
$dtAttr = true;
|
|
|
|
break;
|
|
|
|
case 'Date':
|
|
|
|
case 'StartDate':
|
|
|
|
$sqlValue = "to_days( E.StartTime )";
|
|
|
|
$dtAttr = true;
|
|
|
|
break;
|
|
|
|
case 'Time':
|
|
|
|
case 'StartTime':
|
|
|
|
$sqlValue = "extract( hour_second from E.StartTime )";
|
|
|
|
break;
|
|
|
|
case 'Weekday':
|
|
|
|
case 'StartWeekday':
|
|
|
|
$sqlValue = "weekday( E.StartTime )";
|
|
|
|
break;
|
|
|
|
case 'EndDateTime':
|
|
|
|
$sqlValue = "E.EndTime";
|
|
|
|
$dtAttr = true;
|
|
|
|
break;
|
|
|
|
case 'EndDate':
|
|
|
|
$sqlValue = "to_days( E.EndTime )";
|
|
|
|
$dtAttr = true;
|
|
|
|
break;
|
|
|
|
case 'EndTime':
|
|
|
|
$sqlValue = "extract( hour_second from E.EndTime )";
|
|
|
|
break;
|
|
|
|
case 'EndWeekday':
|
|
|
|
$sqlValue = "weekday( E.EndTime )";
|
|
|
|
break;
|
|
|
|
case 'Id':
|
|
|
|
case 'Name':
|
|
|
|
case 'MonitorId':
|
|
|
|
case 'StorageId':
|
|
|
|
case 'Length':
|
|
|
|
case 'Frames':
|
|
|
|
case 'AlarmFrames':
|
|
|
|
case 'TotScore':
|
|
|
|
case 'AvgScore':
|
|
|
|
case 'MaxScore':
|
|
|
|
case 'Cause':
|
|
|
|
case 'Notes':
|
|
|
|
case 'StateId':
|
|
|
|
case 'Archived':
|
|
|
|
$sqlValue = "E.".$terms[$i]['attr'];
|
|
|
|
break;
|
|
|
|
case 'DiskPercent':
|
|
|
|
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
|
|
|
if ( ! $StorageArea ) {
|
|
|
|
for ( $j = 0; $j < count($terms); $j++ ) {
|
|
|
|
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
|
|
|
$StorageArea = new Storage($terms[$j]['val']);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} // end foreach remaining term
|
|
|
|
if ( ! $StorageArea ) $StorageArea = new Storage();
|
|
|
|
} // end no StorageArea found yet
|
|
|
|
$sqlValue = getDiskPercent($StorageArea);
|
|
|
|
break;
|
|
|
|
case 'DiskBlocks':
|
|
|
|
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
|
|
|
if ( ! $StorageArea ) {
|
|
|
|
for ( $j = 0; $j < count($terms); $j++ ) {
|
|
|
|
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
|
|
|
$StorageArea = new Storage($terms[$j]['val']);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} // end foreach remaining term
|
|
|
|
if ( ! $StorageArea ) $StorageArea = new Storage();
|
|
|
|
} // end no StorageArea found yet
|
|
|
|
$sqlValue = getDiskBlocks($StorageArea);
|
|
|
|
break;
|
|
|
|
default :
|
|
|
|
$sqlValue = $terms[$i]['attr'];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if ( $dtAttr ) {
|
|
|
|
$postfixExpr[] = array('type'=>'attr', 'value'=>$terms[$i]['attr'], 'sqlValue'=>$sqlValue, 'dtAttr'=>true);
|
|
|
|
} else {
|
|
|
|
$postfixExpr[] = array('type'=>'attr', 'value'=>$terms[$i]['attr'], 'sqlValue'=>$sqlValue);
|
|
|
|
}
|
|
|
|
} # end if attr
|
|
|
|
|
|
|
|
if ( isset($terms[$i]['op']) ) {
|
|
|
|
if ( empty($terms[$i]['op']) ) {
|
|
|
|
$terms[$i]['op'] = '=';
|
|
|
|
}
|
|
|
|
switch ( $terms[$i]['op']) {
|
|
|
|
case '=' :
|
|
|
|
case '!=' :
|
|
|
|
case '>=' :
|
|
|
|
case '>' :
|
|
|
|
case '<' :
|
|
|
|
case '<=' :
|
|
|
|
$sqlValue = $terms[$i]['op'];
|
|
|
|
break;
|
|
|
|
case '=~' :
|
|
|
|
$sqlValue = 'regexp';
|
|
|
|
break;
|
|
|
|
case '!~' :
|
|
|
|
$sqlValue = 'not regexp';
|
|
|
|
break;
|
|
|
|
case '=[]' :
|
|
|
|
$sqlValue = 'in (';
|
|
|
|
break;
|
|
|
|
case '![]' :
|
|
|
|
$sqlValue = 'not in (';
|
|
|
|
break;
|
|
|
|
default :
|
|
|
|
Error('Unknown operator in filter '. $terms[$i]['op']);
|
|
|
|
}
|
|
|
|
while( true ) {
|
|
|
|
if ( !count($postfixStack) ) {
|
|
|
|
$postfixStack[] = array('type'=>'op', 'value'=>$terms[$i]['op'], 'sqlValue'=>$sqlValue);
|
|
|
|
break;
|
|
|
|
} elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
|
|
|
|
$postfixStack[] = array('type'=>'op', 'value'=>$terms[$i]['op'], 'sqlValue'=>$sqlValue);
|
|
|
|
break;
|
|
|
|
} elseif ( $priorities[$terms[$i]['op']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
|
|
|
|
$postfixStack[] = array('type'=>'op', 'value'=>$terms[$i]['op'], 'sqlValue'=>$sqlValue );
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
$postfixExpr[] = array_pop($postfixStack);
|
|
|
|
}
|
|
|
|
} // end while
|
|
|
|
} // end if operator
|
|
|
|
|
|
|
|
if ( isset($terms[$i]['val']) ) {
|
|
|
|
$valueList = array();
|
|
|
|
foreach ( preg_split('/["\'\s]*?,["\'\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $terms[$i]['val'])) as $value ) {
|
|
|
|
switch ( $terms[$i]['attr'] ) {
|
|
|
|
case 'MonitorName':
|
|
|
|
case 'Name':
|
|
|
|
case 'Cause':
|
|
|
|
case 'Notes':
|
|
|
|
$value = "'$value'";
|
|
|
|
break;
|
|
|
|
case 'ServerId':
|
|
|
|
if ( $value == 'ZM_SERVER_ID' ) {
|
|
|
|
$value = ZM_SERVER_ID;
|
|
|
|
} else if ( $value == 'NULL' ) {
|
|
|
|
|
|
|
|
} else {
|
|
|
|
$value = dbEscape($value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'StorageId':
|
|
|
|
$StorageArea = new Storage($value);
|
|
|
|
if ( $value != 'NULL' )
|
|
|
|
$value = dbEscape($value);
|
|
|
|
break;
|
|
|
|
case 'DateTime':
|
|
|
|
case 'EndDateTime':
|
|
|
|
case 'StartDateTime':
|
|
|
|
$value = "'".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."'";
|
|
|
|
break;
|
|
|
|
case 'Date':
|
|
|
|
case 'EndDate':
|
|
|
|
case 'StartDate':
|
|
|
|
$value = "to_days('".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."' )";
|
|
|
|
break;
|
|
|
|
case 'Time':
|
|
|
|
case 'EndTime':
|
|
|
|
case 'StartTime':
|
|
|
|
$value = "extract( hour_second from '".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."' )";
|
|
|
|
break;
|
|
|
|
case 'Weekday':
|
|
|
|
case 'EndWeekday':
|
|
|
|
case 'StartWeekday':
|
|
|
|
$value = "weekday( '".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."' )";
|
|
|
|
break;
|
|
|
|
default :
|
|
|
|
if ( $value != 'NULL' )
|
|
|
|
$value = dbEscape($value);
|
|
|
|
} // end switch attribute
|
|
|
|
$valueList[] = $value;
|
|
|
|
} // end foreach value
|
|
|
|
$postfixExpr[] = array('type'=>'val', 'value'=>$terms[$i]['val'], 'sqlValue'=>join(',', $valueList));
|
|
|
|
} // end if has val
|
|
|
|
|
|
|
|
if ( !empty($terms[$i]['cbr']) ) {
|
|
|
|
for ( $j = 0; $j < $terms[$i]['cbr']; $j++ ) {
|
|
|
|
while ( count($postfixStack) ) {
|
|
|
|
$element = array_pop($postfixStack);
|
|
|
|
if ( $element['type'] == 'obr' ) {
|
|
|
|
$postfixExpr[count($postfixExpr)-1]['bracket'] = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$postfixExpr[] = $element;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while ( count($postfixStack) ) {
|
|
|
|
$postfixExpr[] = array_pop($postfixStack);
|
|
|
|
}
|
|
|
|
|
|
|
|
$exprStack = array();
|
|
|
|
//foreach ( $postfixExpr as $element )
|
|
|
|
//{
|
|
|
|
//echo $element['value'].' ';
|
|
|
|
//}
|
|
|
|
//echo "<br>";
|
|
|
|
foreach ( $postfixExpr as $element ) {
|
|
|
|
if ( $element['type'] == 'attr' || $element['type'] == 'val' ) {
|
|
|
|
$node = array('data'=>$element, 'count'=>0);
|
|
|
|
$exprStack[] = $node;
|
|
|
|
} elseif ( $element['type'] == 'op' || $element['type'] == 'cnj' ) {
|
|
|
|
$right = array_pop($exprStack);
|
|
|
|
$left = array_pop($exprStack);
|
|
|
|
$node = array('data'=>$element, 'count'=>2+$left['count']+$right['count'], 'right'=>$right, 'left'=>$left);
|
|
|
|
$exprStack[] = $node;
|
|
|
|
} else {
|
|
|
|
Fatal("Unexpected element type '".$element['type']."', value '".$element['value']."'");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( count($exprStack) != 1 ) {
|
|
|
|
Fatal('Expression stack has '.count($exprStack).' elements');
|
|
|
|
}
|
|
|
|
return array_pop($exprStack);
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
function _parseTreeToInfix($node) {
|
|
|
|
$expression = '';
|
|
|
|
if ( isset($node) ) {
|
|
|
|
if ( isset($node['left']) ) {
|
|
|
|
if ( !empty($node['data']['bracket']) )
|
|
|
|
$expression .= '( ';
|
|
|
|
$expression .= _parseTreeToInfix($node['left']);
|
|
|
|
}
|
|
|
|
$expression .= $node['data']['value'].' ';
|
|
|
|
if ( isset($node['right']) ) {
|
|
|
|
$expression .= _parseTreeToInfix($node['right']);
|
|
|
|
if ( !empty($node['data']['bracket']) )
|
|
|
|
$expression .= ') ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $expression;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
function parseTreeToInfix($tree) {
|
|
|
|
return _parseTreeToInfix($tree);
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function _parseTreeToSQL( $node, $cbr=false )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$expression = '';
|
|
|
|
if ( $node )
|
|
|
|
{
|
|
|
|
if ( isset($node['left']) )
|
|
|
|
{
|
|
|
|
if ( !empty($node['data']['bracket']) )
|
|
|
|
$expression .= '( ';
|
|
|
|
$expression .= _parseTreeToSQL( $node['left'] );
|
|
|
|
}
|
|
|
|
$inExpr = $node['data']['type'] == 'op' && ($node['data']['value'] == '=[]' || $node['data']['value'] == '![]');
|
|
|
|
$expression .= $node['data']['sqlValue'];
|
|
|
|
if ( !$inExpr )
|
|
|
|
$expression .= ' ';
|
|
|
|
if ( $cbr )
|
|
|
|
$expression .= ') ';
|
|
|
|
if ( isset($node['right']) )
|
|
|
|
{
|
|
|
|
$expression .= _parseTreeToSQL( $node['right'], $inExpr );
|
|
|
|
if ( !empty($node['data']['bracket']) )
|
|
|
|
$expression .= ') ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return( $expression );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function parseTreeToSQL( $tree )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
return( _parseTreeToSQL( $tree ) );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function _parseTreeToFilter( $node, &$terms, &$level )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$elements = array();
|
|
|
|
if ( $node )
|
|
|
|
{
|
|
|
|
if ( isset($node['left']) )
|
|
|
|
{
|
|
|
|
if ( !empty($node['data']['bracket']) )
|
|
|
|
$terms[$level]['obr'] = 1;
|
|
|
|
_parseTreeToFilter( $node['left'], $terms, $level );
|
|
|
|
}
|
|
|
|
if ( $node['data']['type'] == 'cnj' )
|
|
|
|
{
|
|
|
|
$level++;
|
|
|
|
}
|
|
|
|
$terms[$level][$node['data']['type']] = $node['data']['value'];
|
|
|
|
if ( isset($node['right']) )
|
|
|
|
{
|
|
|
|
_parseTreeToFilter( $node['right'], $terms, $level );
|
|
|
|
if ( !empty($node['data']['bracket']) )
|
|
|
|
$terms[$level]['cbr'] = 1;
|
|
|
|
}
|
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function parseTreeToFilter( $tree )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$terms = array();
|
|
|
|
if ( isset($tree) )
|
|
|
|
{
|
|
|
|
$level = 0;
|
|
|
|
_parseTreeToFilter( $tree, $terms, $level );
|
|
|
|
}
|
|
|
|
return( array( 'Query' => array( 'terms' => $terms ) ) );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function parseTreeToQuery( $tree )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$filter = parseTreeToFilter( $tree );
|
|
|
|
parseFilter( $filter, false, '&' );
|
|
|
|
return( $filter['query'] );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function _drawTree( $node, $level )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
if ( isset($node['left']) )
|
|
|
|
{
|
|
|
|
_drawTree( $node['left'], $level+1 );
|
|
|
|
}
|
|
|
|
echo str_repeat( ".", $level*2 ).$node['data']['value']."<br>";
|
|
|
|
if ( isset($node['right']) )
|
|
|
|
{
|
|
|
|
_drawTree( $node['right'], $level+1 );
|
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function drawTree( $tree )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
_drawTree( $tree, 0 );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function _extractDatetimeRange( &$node, &$minTime, &$maxTime, &$expandable, $subOr )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$pruned = $leftPruned = $rightPruned = false;
|
|
|
|
if ( $node )
|
|
|
|
{
|
|
|
|
if ( isset($node['left']) && isset($node['right']) )
|
|
|
|
{
|
|
|
|
if ( $node['data']['type'] == 'cnj' && $node['data']['value'] == 'or' )
|
|
|
|
{
|
|
|
|
$subOr = true;
|
|
|
|
}
|
|
|
|
elseif ( !empty($node['left']['data']['dtAttr']) )
|
|
|
|
{
|
|
|
|
if ( $subOr )
|
|
|
|
{
|
|
|
|
$expandable = false;
|
|
|
|
}
|
|
|
|
elseif ( $node['data']['type'] == 'op' )
|
|
|
|
{
|
|
|
|
if ( $node['data']['value'] == '>' || $node['data']['value'] == '>=' )
|
|
|
|
{
|
|
|
|
if ( !$minTime || $minTime > $node['right']['data']['sqlValue'] )
|
|
|
|
{
|
|
|
|
$minTime = $node['right']['data']['value'];
|
|
|
|
return( true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( $node['data']['value'] == '<' || $node['data']['value'] == '<=' )
|
|
|
|
{
|
|
|
|
if ( !$maxTime || $maxTime < $node['right']['data']['sqlValue'] )
|
|
|
|
{
|
|
|
|
$maxTime = $node['right']['data']['value'];
|
|
|
|
return( true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Fatal( "Unexpected node type '".$node['data']['type']."'" );
|
|
|
|
}
|
|
|
|
return( false );
|
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
$leftPruned = _extractDatetimeRange( $node['left'], $minTime, $maxTime, $expandable, $subOr );
|
|
|
|
$rightPruned = _extractDatetimeRange( $node['right'], $minTime, $maxTime, $expandable, $subOr );
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
if ( $leftPruned && $rightPruned )
|
|
|
|
{
|
|
|
|
$pruned = true;
|
|
|
|
}
|
|
|
|
elseif ( $leftPruned )
|
|
|
|
{
|
|
|
|
$node = $node['right'];
|
|
|
|
}
|
|
|
|
elseif ( $rightPruned )
|
|
|
|
{
|
|
|
|
$node = $node['left'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return( $pruned );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function extractDatetimeRange( &$tree, &$minTime, &$maxTime, &$expandable )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$minTime = "";
|
|
|
|
$maxTime = "";
|
|
|
|
$expandable = true;
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
_extractDateTimeRange( $tree, $minTime, $maxTime, $expandable, false );
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function appendDatetimeRange( &$tree, $minTime, $maxTime=false )
|
|
|
|
{
|
2018-04-21 01:10:38 +08:00
|
|
|
$attrNode = array( 'data'=>array( 'type'=>'attr', 'value'=>'StartDateTime', 'sqlValue'=>'E.StartTime', 'dtAttr'=>true ), 'count'=>0 );
|
|
|
|
$valNode = array( 'data'=>array( 'type'=>'val', 'value'=>$minTime, 'sqlValue'=>$minTime ), 'count'=>0 );
|
|
|
|
$opNode = array( 'data'=>array( 'type'=>'op', 'value'=>'>=', 'sqlValue'=>'>=' ), 'count'=>2, 'left'=>$attrNode, 'right'=>$valNode );
|
|
|
|
if ( isset($tree) )
|
|
|
|
{
|
|
|
|
$cnjNode = array( 'data'=>array( 'type'=>'cnj', 'value'=>'and', 'sqlValue'=>'and' ), 'count'=>2+$tree['count']+$opNode['count'], 'left'=>$tree, 'right'=>$opNode );
|
|
|
|
$tree = $cnjNode;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$tree = $opNode;
|
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2018-04-21 01:10:38 +08:00
|
|
|
if ( $maxTime )
|
|
|
|
{
|
|
|
|
$attrNode = array( 'data'=>array( 'type'=>'attr', 'value'=>'StartDateTime', 'sqlValue'=>'E.StartTime', 'dtAttr'=>true ), 'count'=>0 );
|
|
|
|
$valNode = array( 'data'=>array( 'type'=>'val', 'value'=>$maxTime, 'sqlValue'=>$maxTime ), 'count'=>0 );
|
|
|
|
$opNode = array( 'data'=>array( 'type'=>'op', 'value'=>'<=', 'sqlValue'=>'<=' ), 'count'=>2, 'left'=>$attrNode, 'right'=>$valNode );
|
|
|
|
$cnjNode = array( 'data'=>array( 'type'=>'cnj', 'value'=>'and', 'sqlValue'=>'and' ), 'count'=>2+$tree['count']+$opNode['count'], 'left'=>$tree, 'right'=>$opNode );
|
|
|
|
$tree = $cnjNode;
|
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
?>
|