зеркало из https://github.com/mozilla/gecko-dev.git
Massive stomp on the query page and buglist page. Added the ability
to use the "boolean charts" to do very powerful queries.
This commit is contained in:
Родитель
163d1d2283
Коммит
7ecba992bf
|
@ -78,10 +78,10 @@ sub url_quote {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub ProcessFormFields {
|
sub ParseUrlString {
|
||||||
my ($buffer) = (@_);
|
my ($buffer, $f, $m) = (@_);
|
||||||
undef %::FORM;
|
undef %$f;
|
||||||
undef %::MFORM;
|
undef %$m;
|
||||||
|
|
||||||
my %isnull;
|
my %isnull;
|
||||||
my $remaining = $buffer;
|
my $remaining = $buffer;
|
||||||
|
@ -105,13 +105,13 @@ sub ProcessFormFields {
|
||||||
$value = "";
|
$value = "";
|
||||||
}
|
}
|
||||||
if ($value ne "") {
|
if ($value ne "") {
|
||||||
if (defined $::FORM{$name}) {
|
if (defined $f->{$name}) {
|
||||||
$::FORM{$name} .= $value;
|
$f->{$name} .= $value;
|
||||||
my $ref = $::MFORM{$name};
|
my $ref = $m->{$name};
|
||||||
push @$ref, $value;
|
push @$ref, $value;
|
||||||
} else {
|
} else {
|
||||||
$::FORM{$name} = $value;
|
$f->{$name} = $value;
|
||||||
$::MFORM{$name} = [$value];
|
$m->{$name} = [$value];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$isnull{$name} = 1;
|
$isnull{$name} = 1;
|
||||||
|
@ -119,15 +119,21 @@ sub ProcessFormFields {
|
||||||
}
|
}
|
||||||
if (defined %isnull) {
|
if (defined %isnull) {
|
||||||
foreach my $name (keys(%isnull)) {
|
foreach my $name (keys(%isnull)) {
|
||||||
if (!defined $::FORM{$name}) {
|
if (!defined $f->{$name}) {
|
||||||
$::FORM{$name} = "";
|
$f->{$name} = "";
|
||||||
$::MFORM{$name} = [];
|
$m->{$name} = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub ProcessFormFields {
|
||||||
|
my ($buffer) = (@_);
|
||||||
|
return ParseUrlString($buffer, \%::FORM, \%::MFORM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sub ProcessMultipartFormFields {
|
sub ProcessMultipartFormFields {
|
||||||
my ($boundary) = (@_);
|
my ($boundary) = (@_);
|
||||||
$boundary =~ s/^-*//;
|
$boundary =~ s/^-*//;
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
<html> <head>
|
||||||
|
<title>The "boolean chart" section of the query page</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>The "boolean chart" section of the query page</h1>
|
||||||
|
|
||||||
|
("Boolean chart" is a terrible term; anyone got a better one I can use
|
||||||
|
instead?)
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The Bugzilla query page is designed to be reasonably easy to use.
|
||||||
|
But, with such ease of use always comes some lack of power. The
|
||||||
|
"boolean chart" section is designed to let you do very powerful
|
||||||
|
queries, but it's not the easiest thing to learn (or explain).
|
||||||
|
<p>
|
||||||
|
So.
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The boolean chart starts with a single "term". A term is a
|
||||||
|
combination of two pulldown menus and a text field.
|
||||||
|
You choose items from the menus, specifying "what kind of thing
|
||||||
|
am I searching for" and "what kind of matching do I want", and type in
|
||||||
|
a value on the text field, specifying "what should it match".
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The real fun starts when you click on the "Or" or "And" buttons. If
|
||||||
|
you bonk on the "Or" button, then you get a second term to the right
|
||||||
|
of the first one. You can then configure that term, and the result of
|
||||||
|
the query will be anything that matches either of the terms.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Or, you can bonk the "And" button, and get a new term below the
|
||||||
|
original one, and now the result of the query will be anything that
|
||||||
|
matches both of the terms.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
And you can keep clicking "And" and "Or", and get a page with tons of
|
||||||
|
terms. "Or" has higher precedence than "And". (In other words, you
|
||||||
|
can think of each line of "Or" stuff as having parenthesis around it.)
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The most subtle thing is this "Add another boolean chart" button.
|
||||||
|
This is almost the same thing as the "And" button. The difference is
|
||||||
|
if you use one of the fields where several items can be associated
|
||||||
|
with a single bug. This includes "Comments", "CC", and all the
|
||||||
|
"changed [something]" entries. Now, if you have multiple terms that
|
||||||
|
all talk about one of these fields, it's ambiguous whether they are
|
||||||
|
allowed to be talking about different instances of that field. So,
|
||||||
|
to let you have it both ways, they always mean the same instance,
|
||||||
|
unless the terms appear on different charts.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
For example: if you search for "priority changed to P5" and
|
||||||
|
"priority changed by person@addr", it will only find bugs where the
|
||||||
|
given person at some time changed the priority to P5. However, if
|
||||||
|
what you really want is to find all bugs where the milestone was
|
||||||
|
changed at some time by the person, and someone (possibly someone
|
||||||
|
else) at some time changed the milestone to P5, then you would put
|
||||||
|
the two terms in two different charts.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Clear as mud? Please, I beg you, rewrite this document to make
|
||||||
|
everything crystal clear, and send the improved version to <a
|
||||||
|
href="terry@mozilla.org">Terry</a>.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<!-- hhmts start -->
|
||||||
|
Last modified: Thu Jan 27 16:56:11 2000
|
||||||
|
<!-- hhmts end -->
|
||||||
|
</body> </html>
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -882,19 +882,24 @@ AddFDef("short_desc", "Summary", 1);
|
||||||
AddFDef("product", "Product", 1);
|
AddFDef("product", "Product", 1);
|
||||||
AddFDef("version", "Version", 1);
|
AddFDef("version", "Version", 1);
|
||||||
AddFDef("rep_platform", "Platform", 1);
|
AddFDef("rep_platform", "Platform", 1);
|
||||||
|
AddFDef("bug_file_loc", "URL", 1);
|
||||||
AddFDef("op_sys", "OS/Version", 1);
|
AddFDef("op_sys", "OS/Version", 1);
|
||||||
AddFDef("bug_status", "Status", 1);
|
AddFDef("bug_status", "Status", 1);
|
||||||
|
AddFDef("status_whiteboard", "Status Whiteboard", 1);
|
||||||
|
AddFDef("keywords", "Keywords", 1);
|
||||||
AddFDef("resolution", "Resolution", 1);
|
AddFDef("resolution", "Resolution", 1);
|
||||||
AddFDef("bug_severity", "Severity", 1);
|
AddFDef("bug_severity", "Severity", 1);
|
||||||
AddFDef("priority", "Priority", 1);
|
AddFDef("priority", "Priority", 1);
|
||||||
AddFDef("component", "Component", 1);
|
AddFDef("component", "Component", 1);
|
||||||
AddFDef("assigned_to", "AssignedTo", 1);
|
AddFDef("assigned_to", "AssignedTo", 1);
|
||||||
AddFDef("reporter", "ReportedBy", 1);
|
AddFDef("reporter", "ReportedBy", 1);
|
||||||
|
AddFDef("votes", "Votes", 0);
|
||||||
AddFDef("qa_contact", "QAContact", 0);
|
AddFDef("qa_contact", "QAContact", 0);
|
||||||
AddFDef("cc", "CC", 0);
|
AddFDef("cc", "CC", 0);
|
||||||
AddFDef("dependson", "BugsThisDependsOn", 0);
|
AddFDef("dependson", "BugsThisDependsOn", 0);
|
||||||
AddFDef("blocked", "OtherBugsDependingOnThis", 0);
|
AddFDef("blocked", "OtherBugsDependingOnThis", 0);
|
||||||
AddFDef("target_milestone", "Target Milestone", 0);
|
AddFDef("target_milestone", "Target Milestone", 0);
|
||||||
|
AddFDef("longdesc", "Comment", 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -468,7 +468,7 @@ print "
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td align=left valign=top>
|
<td align=left valign=top>
|
||||||
@{[make_selection_widget(\"platform\",\@::legal_platform,$default{'platform'}, $type{'platform'}, 1)]}
|
@{[make_selection_widget(\"rep_platform\",\@::legal_platform,$default{'platform'}, $type{'platform'}, 1)]}
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td align=left valign=top>
|
<td align=left valign=top>
|
||||||
|
@ -663,6 +663,104 @@ print "
|
||||||
<p>
|
<p>
|
||||||
";
|
";
|
||||||
|
|
||||||
|
|
||||||
|
my @fields;
|
||||||
|
push(@fields, ["noop", "---"]);
|
||||||
|
SendSQL("SELECT name, description FROM fielddefs ORDER BY sortkey");
|
||||||
|
while (MoreSQLData()) {
|
||||||
|
my ($name, $description) = (FetchSQLData());
|
||||||
|
push(@fields, [$name, $description]);
|
||||||
|
}
|
||||||
|
|
||||||
|
my @types = (
|
||||||
|
["noop", "---"],
|
||||||
|
["equals", "equal to"],
|
||||||
|
["notequals", "not equal to"],
|
||||||
|
["casesubstring", "contains (case-sensitive) substring"],
|
||||||
|
["substring", "contains (case-insensitive) substring"],
|
||||||
|
["notsubstring", "does not contain (case-insensitive) substring"],
|
||||||
|
["regexp", "contains regexp"],
|
||||||
|
["notregexp", "does not contain regexp"],
|
||||||
|
["lessthan", "less than"],
|
||||||
|
["greaterthan", "greater than"],
|
||||||
|
["anywords", "any words"],
|
||||||
|
["allwords", "all words"],
|
||||||
|
["nowords", "none of the words"],
|
||||||
|
["changedbefore", "changed before"],
|
||||||
|
["changedafter", "changed after"],
|
||||||
|
["changedto", "changed to"],
|
||||||
|
["changedby", "changed by"],
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
foreach my $cmd (grep(/^cmd-/, keys(%::FORM))) {
|
||||||
|
if ($cmd =~ /^cmd-add(\d+)-(\d+)-(\d+)$/) {
|
||||||
|
$::FORM{"field$1-$2-$3"} = "xyzzy";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# foreach my $i (sort(keys(%::FORM))) {
|
||||||
|
# print "$i : " . value_quote($::FORM{$i}) . "<BR>\n";
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
if (!exists $::FORM{'field0-0-0'}) {
|
||||||
|
$::FORM{'field0-0-0'} = "xyzzy";
|
||||||
|
}
|
||||||
|
|
||||||
|
print qq{<A NAME="chart"> </A>\n};
|
||||||
|
|
||||||
|
my $chart;
|
||||||
|
for ($chart=0 ; exists $::FORM{"field$chart-0-0"} ; $chart++) {
|
||||||
|
my @rows;
|
||||||
|
my $row;
|
||||||
|
for ($row = 0 ; exists $::FORM{"field$chart-$row-0"} ; $row++) {
|
||||||
|
my @cols;
|
||||||
|
my $col;
|
||||||
|
for ($col = 0 ; exists $::FORM{"field$chart-$row-$col"} ; $col++) {
|
||||||
|
my $key = "$chart-$row-$col";
|
||||||
|
my $deffield = $::FORM{"field$key"} || "";
|
||||||
|
my $deftype = $::FORM{"type$key"} || "";
|
||||||
|
my $defvalue = value_quote($::FORM{"value$key"} || "");
|
||||||
|
my $line = "";
|
||||||
|
$line .= "<TD>";
|
||||||
|
$line .= BuildPulldown("field$key", \@fields, $deffield);
|
||||||
|
$line .= BuildPulldown("type$key", \@types, $deftype);
|
||||||
|
$line .= qq{<INPUT NAME="value$key" VALUE="$defvalue">};
|
||||||
|
$line .= "</TD>\n";
|
||||||
|
push(@cols, $line);
|
||||||
|
}
|
||||||
|
push(@rows, "<TR>" . join(qq{<TD ALIGN="center"> or </TD>\n}, @cols) .
|
||||||
|
qq{<TD><INPUT TYPE="submit" VALUE="Or" NAME="cmd-add$chart-$row-$col"></TD></TR>});
|
||||||
|
}
|
||||||
|
print qq{
|
||||||
|
<HR>
|
||||||
|
<TABLE>
|
||||||
|
};
|
||||||
|
print join('<TR><TD>And</TD></TR>', @rows);
|
||||||
|
print qq{
|
||||||
|
<TR><TD><INPUT TYPE="submit" VALUE="And" NAME="cmd-add$chart-$row-0">
|
||||||
|
};
|
||||||
|
my $n = $chart + 1;
|
||||||
|
if (!exists $::FORM{"field$n-0-0"}) {
|
||||||
|
print qq{
|
||||||
|
|
||||||
|
<INPUT TYPE="submit" VALUE="Add another boolean chart" NAME="cmd-add$n-0-0">
|
||||||
|
|
||||||
|
<NOBR><A HREF="booleanchart.html">What is this stuff?</A></NOBR>
|
||||||
|
};
|
||||||
|
}
|
||||||
|
print qq{
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
};
|
||||||
|
}
|
||||||
|
print qq{<HR>};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!$userid) {
|
if (!$userid) {
|
||||||
print qq{<INPUT TYPE="hidden" NAME="cmdtype" VALUE="doit">};
|
print qq{<INPUT TYPE="hidden" NAME="cmdtype" VALUE="doit">};
|
||||||
} else {
|
} else {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче