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; }
function parseFilter(&$filter, $saveToSession = false, $querySep = '&') { $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; } } }