Ejemplo n.º 1
0
function parseFilterToTree($filter)
{
    if (count($filter['terms']) > 0) {
        $postfixExpr = array();
        $postfixStack = array();
        $priorities = array('<' => 1, '<=' => 1, '>' => 1, '>=' => 1, '=' => 2, '!=' => 2, '=~' => 2, '!~' => 2, '=[]' => 2, '![]' => 2, 'and' => 3, 'or' => 4);
        for ($i = 0; $i <= count($filter['terms']); $i++) {
            if (!empty($filter['terms'][$i]['cnj'])) {
                while (true) {
                    if (!count($postfixStack)) {
                        $postfixStack[] = array('type' => "cnj", 'value' => $filter['terms'][$i]['cnj'], 'sqlValue' => $filter['terms'][$i]['cnj']);
                        break;
                    } elseif ($postfixStack[count($postfixStack) - 1]['type'] == 'obr') {
                        $postfixStack[] = array('type' => "cnj", 'value' => $filter['terms'][$i]['cnj'], 'sqlValue' => $filter['terms'][$i]['cnj']);
                        break;
                    } elseif ($priorities[$filter['terms'][$i]['cnj']] < $priorities[$postfixStack[count($postfixStack) - 1]['value']]) {
                        $postfixStack[] = array('type' => "cnj", 'value' => $filter['terms'][$i]['cnj'], 'sqlValue' => $filter['terms'][$i]['cnj']);
                        break;
                    } else {
                        $postfixExpr[] = array_pop($postfixStack);
                    }
                }
            }
            if (!empty($filter['terms'][$i]['obr'])) {
                for ($j = 0; $j < $filter['terms'][$i]['obr']; $j++) {
                    $postfixStack[] = array('type' => "obr", 'value' => $filter['terms'][$i]['obr']);
                }
            }
            if (!empty($filter['terms'][$i]['attr'])) {
                $dtAttr = false;
                switch ($filter['terms'][$i]['attr']) {
                    case 'MonitorName':
                        $sqlValue = 'M.' . preg_replace('/^Monitor/', '', $filter['terms'][$i]['attr']);
                        break;
                    case 'Name':
                        $sqlValue = "E.Name";
                        break;
                    case 'Cause':
                        $sqlValue = "E.Cause";
                        break;
                    case 'DateTime':
                        $sqlValue = "E.StartTime";
                        $dtAttr = true;
                        break;
                    case 'Date':
                        $sqlValue = "to_days( E.StartTime )";
                        $dtAttr = true;
                        break;
                    case 'Time':
                        $sqlValue = "extract( hour_second from E.StartTime )";
                        break;
                    case 'Weekday':
                        $sqlValue = "weekday( E.StartTime )";
                        break;
                    case 'Id':
                    case 'Name':
                    case 'MonitorId':
                    case 'Length':
                    case 'Frames':
                    case 'AlarmFrames':
                    case 'TotScore':
                    case 'AvgScore':
                    case 'MaxScore':
                    case 'Archived':
                        $sqlValue = "E." . $filter['terms'][$i]['attr'];
                        break;
                    case 'DiskPercent':
                        $sqlValue = getDiskPercent();
                        break;
                    case 'DiskBlocks':
                        $sqlValue = getDiskBlocks();
                        break;
                    default:
                        $sqlValue = $filter['terms'][$i]['attr'];
                        break;
                }
                if ($dtAttr) {
                    $postfixExpr[] = array('type' => "attr", 'value' => $filter['terms'][$i]['attr'], 'sqlValue' => $sqlValue, 'dtAttr' => true);
                } else {
                    $postfixExpr[] = array('type' => "attr", 'value' => $filter['terms'][$i]['attr'], 'sqlValue' => $sqlValue);
                }
            }
            if (isset($filter['terms'][$i]['op'])) {
                if (empty($filter['terms'][$i]['op'])) {
                    $filter['terms'][$i]['op'] = '=';
                }
                switch ($filter['terms'][$i]['op']) {
                    case '=':
                    case '!=':
                    case '>=':
                    case '>':
                    case '<':
                    case '<=':
                        $sqlValue = $filter['terms'][$i]['op'];
                        break;
                    case '=~':
                        $sqlValue = "regexp";
                        break;
                    case '!~':
                        $sqlValue = "not regexp";
                        break;
                    case '=[]':
                        $sqlValue = 'in (';
                        break;
                    case '![]':
                        $sqlValue = 'not in (';
                        break;
                }
                while (true) {
                    if (!count($postfixStack)) {
                        $postfixStack[] = array('type' => "op", 'value' => $filter['terms'][$i]['op'], 'sqlValue' => $sqlValue);
                        break;
                    } elseif ($postfixStack[count($postfixStack) - 1]['type'] == 'obr') {
                        $postfixStack[] = array('type' => "op", 'value' => $filter['terms'][$i]['op'], 'sqlValue' => $sqlValue);
                        break;
                    } elseif ($priorities[$filter['terms'][$i]['op']] < $priorities[$postfixStack[count($postfixStack) - 1]['value']]) {
                        $postfixStack[] = array('type' => "op", 'value' => $filter['terms'][$i]['op'], 'sqlValue' => $sqlValue);
                        break;
                    } else {
                        $postfixExpr[] = array_pop($postfixStack);
                    }
                }
            }
            if (isset($filter['terms'][$i]['val'])) {
                $valueList = array();
                foreach (preg_split('/["\'\\s]*?,["\'\\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $filter['terms'][$i]['val'])) as $value) {
                    switch ($filter['terms'][$i]['attr']) {
                        case 'MonitorName':
                        case 'Name':
                        case 'Cause':
                            $value = "'{$value}'";
                            break;
                        case 'DateTime':
                            $value = "'" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "'";
                            break;
                        case 'Date':
                            $value = "to_days( '" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "' )";
                            break;
                        case 'Time':
                            $value = "extract( hour_second from '" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "' )";
                            break;
                        case 'Weekday':
                            $value = "weekday( '" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "' )";
                            break;
                    }
                    $valueList[] = $value;
                }
                $postfixExpr[] = array('type' => "val", 'value' => $filter['terms'][$i]['val'], 'sqlValue' => join(',', $valueList));
            }
            if (!empty($filter['terms'][$i]['cbr'])) {
                for ($j = 0; $j < $filter['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");
        }
        $exprTree = array_pop($exprStack);
        return $exprTree;
    }
    return false;
}
Ejemplo n.º 2
0
function parseFilter(&$filter, $saveToSession = false, $querySep = '&amp;')
{
    $filter['query'] = '';
    $filter['sql'] = '';
    $filter['fields'] = '';
    if (isset($filter['terms']) && count($filter['terms'])) {
        for ($i = 0; $i < count($filter['terms']); $i++) {
            if (isset($filter['terms'][$i]['cnj'])) {
                $filter['query'] .= $querySep . "filter[terms][{$i}][cnj]=" . urlencode($filter['terms'][$i]['cnj']);
                $filter['sql'] .= " " . $filter['terms'][$i]['cnj'] . " ";
                $filter['fields'] .= "<input type=\"hidden\" name=\"filter[terms][{$i}][cnj]\" value=\"" . htmlspecialchars($filter['terms'][$i]['cnj']) . "\"/>\n";
            }
            if (isset($filter['terms'][$i]['obr'])) {
                $filter['query'] .= $querySep . "filter[terms][{$i}][obr]=" . urlencode($filter['terms'][$i]['obr']);
                $filter['sql'] .= " " . str_repeat("(", $filter['terms'][$i]['obr']) . " ";
                $filter['fields'] .= "<input type=\"hidden\" name=\"filter[terms][{$i}][obr]\" value=\"" . htmlspecialchars($filter['terms'][$i]['obr']) . "\"/>\n";
            }
            if (isset($filter['terms'][$i]['attr'])) {
                $filter['query'] .= $querySep . "filter[terms][{$i}][attr]=" . urlencode($filter['terms'][$i]['attr']);
                $filter['fields'] .= "<input type=\"hidden\" name=\"filter[terms][{$i}][attr]\" value=\"" . htmlspecialchars($filter['terms'][$i]['attr']) . "\"/>\n";
                switch ($filter['terms'][$i]['attr']) {
                    case 'MonitorName':
                        $filter['sql'] .= 'M.' . preg_replace('/^Monitor/', '', $filter['terms'][$i]['attr']);
                        break;
                    case 'DateTime':
                        $filter['sql'] .= "E.StartTime";
                        break;
                    case 'Date':
                        $filter['sql'] .= "to_days( E.StartTime )";
                        break;
                    case 'Time':
                        $filter['sql'] .= "extract( hour_second from E.StartTime )";
                        break;
                    case 'Weekday':
                        $filter['sql'] .= "weekday( E.StartTime )";
                        break;
                    case 'Id':
                    case 'Name':
                    case 'MonitorId':
                    case 'Length':
                    case 'Frames':
                    case 'AlarmFrames':
                    case 'TotScore':
                    case 'AvgScore':
                    case 'MaxScore':
                    case 'Cause':
                    case 'Notes':
                    case 'Archived':
                        $filter['sql'] .= 'E.' . $filter['terms'][$i]['attr'];
                        break;
                    case 'DiskPercent':
                        $filter['sql'] .= getDiskPercent();
                        break;
                    case 'DiskBlocks':
                        $filter['sql'] .= getDiskBlocks();
                        break;
                    case 'SystemLoad':
                        $filter['sql'] .= getLoad();
                        break;
                }
                $valueList = array();
                foreach (preg_split('/["\'\\s]*?,["\'\\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $filter['terms'][$i]['val'])) as $value) {
                    switch ($filter['terms'][$i]['attr']) {
                        case 'MonitorName':
                        case 'Name':
                        case 'Cause':
                        case 'Notes':
                            $value = dbEscape($value);
                            break;
                        case 'DateTime':
                            $value = "'" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "'";
                            break;
                        case 'Date':
                            $value = "to_days( '" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "' )";
                            break;
                        case 'Time':
                            $value = "extract( hour_second from '" . strftime(STRF_FMT_DATETIME_DB, strtotime($value)) . "' )";
                            break;
                        default:
                            $value = dbEscape($value);
                            break;
                    }
                    $valueList[] = $value;
                }
                switch ($filter['terms'][$i]['op']) {
                    case '=':
                    case '!=':
                    case '>=':
                    case '>':
                    case '<':
                    case '<=':
                        $filter['sql'] .= " " . $filter['terms'][$i]['op'] . " {$value}";
                        break;
                    case '=~':
                        $filter['sql'] .= " regexp " . $value;
                        break;
                    case '!~':
                        $filter['sql'] .= " not regexp " . $value;
                        break;
                    case '=[]':
                        $filter['sql'] .= " in (" . join(",", $valueList) . ")";
                        break;
                    case '![]':
                        $filter['sql'] .= " not in (" . join(",", $valueList) . ")";
                        break;
                }
                $filter['query'] .= $querySep . "filter[terms][{$i}][op]=" . urlencode($filter['terms'][$i]['op']);
                $filter['fields'] .= "<input type=\"hidden\" name=\"filter[terms][{$i}][op]\" value=\"" . htmlspecialchars($filter['terms'][$i]['op']) . "\"/>\n";
                $filter['query'] .= $querySep . "filter[terms][{$i}][val]=" . urlencode($filter['terms'][$i]['val']);
                $filter['fields'] .= "<input type=\"hidden\" name=\"filter[terms][{$i}][val]\" value=\"" . htmlspecialchars($filter['terms'][$i]['val']) . "\"/>\n";
            }
            if (isset($filter['terms'][$i]['cbr'])) {
                $filter['query'] .= $querySep . "filter[terms][{$i}][cbr]=" . urlencode($filter['terms'][$i]['cbr']);
                $filter['sql'] .= " " . str_repeat(")", $filter['terms'][$i]['cbr']) . " ";
                $filter['fields'] .= "<input type=\"hidden\" name=\"filter[terms][{$i}][cbr]\" value=\"" . htmlspecialchars($filter['terms'][$i]['cbr']) . "\"/>\n";
            }
        }
        if ($filter['sql']) {
            $filter['sql'] = " and ( " . $filter['sql'] . " )";
        }
        if ($saveToSession) {
            $_SESSION['filter'] = $filter;
        }
    }
}