analysis/app: parse prefix separately
Change-Id: I185b853a2580ee16741cbf1581ba465400a5b28b
Reviewed-on: https://go-review.googlesource.com/35947
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/analysis/app/compare.go b/analysis/app/compare.go
index 9127879..21a89ea 100644
--- a/analysis/app/compare.go
+++ b/analysis/app/compare.go
@@ -167,7 +167,7 @@
func (a *App) compareQuery(q string) *compareData {
// Parse query
- queries := parseQueryString(q)
+ prefix, queries := parseQueryString(q)
// Send requests
// TODO(quentin): Issue requests in parallel?
@@ -175,6 +175,9 @@
var found int
for _, qPart := range queries {
group := &resultGroup{}
+ if prefix != "" {
+ qPart = prefix + " " + qPart
+ }
res := a.StorageClient.Query(qPart)
for res.Next() {
group.add(res.Result())
diff --git a/analysis/app/parse.go b/analysis/app/parse.go
index dab586c..0286a8f 100644
--- a/analysis/app/parse.go
+++ b/analysis/app/parse.go
@@ -8,11 +8,11 @@
// parseQueryString splits a user-entered query into one or more storage server queries.
// The supported query formats are:
-// prefix | one vs two - parsed as {"prefix one", "prefix two"}
-// prefix one vs two - parsed as {"prefix one", "two"}
-// anything else - parsed as {"anything else"}
+// prefix | one vs two - parsed as "prefix", {"one", "two"}
+// prefix one vs two - parsed as "", {"prefix one", "two"}
+// anything else - parsed as "", {"anything else"}
// The vs and | separators must not be quoted.
-func parseQueryString(q string) []string {
+func parseQueryString(q string) (string, []string) {
var queries []string
var parts []string
var prefix string
@@ -33,10 +33,10 @@
case c == ' ', c == '\t':
switch part := q[:r]; {
case part == "|" && prefix == "":
- prefix = strings.Join(parts, " ") + " "
+ prefix = strings.Join(parts, " ")
parts = nil
case part == "vs":
- queries = append(queries, prefix+strings.Join(parts, " "))
+ queries = append(queries, strings.Join(parts, " "))
parts = nil
default:
parts = append(parts, part)
@@ -54,7 +54,7 @@
parts = append(parts, q)
}
if len(parts) > 0 {
- queries = append(queries, prefix+strings.Join(parts, " "))
+ queries = append(queries, strings.Join(parts, " "))
}
- return queries
+ return prefix, queries
}
diff --git a/analysis/app/parse_test.go b/analysis/app/parse_test.go
index 3a892a8..0a4793a 100644
--- a/analysis/app/parse_test.go
+++ b/analysis/app/parse_test.go
@@ -11,20 +11,24 @@
func TestParseQueryString(t *testing.T) {
tests := []struct {
- q string
- want []string
+ q string
+ wantPrefix string
+ wantParts []string
}{
- {"prefix | one vs two", []string{"prefix one", "prefix two"}},
- {"prefix one vs two", []string{"prefix one", "two"}},
- {"anything else", []string{"anything else"}},
- {`one vs "two vs three"`, []string{"one", `"two vs three"`}},
- {"mixed\ttabs \"and\tspaces\"", []string{"mixed tabs \"and\tspaces\""}},
+ {"prefix | one vs two", "prefix", []string{"one", "two"}},
+ {"prefix one vs two", "", []string{"prefix one", "two"}},
+ {"anything else", "", []string{"anything else"}},
+ {`one vs "two vs three"`, "", []string{"one", `"two vs three"`}},
+ {"mixed\ttabs \"and\tspaces\"", "", []string{"mixed tabs \"and\tspaces\""}},
}
for _, test := range tests {
t.Run(test.q, func(t *testing.T) {
- have := parseQueryString(test.q)
- if !reflect.DeepEqual(have, test.want) {
- t.Fatalf("parseQueryString = %#v, want %#v", have, test.want)
+ havePrefix, haveParts := parseQueryString(test.q)
+ if havePrefix != test.wantPrefix {
+ t.Errorf("parseQueryString returned prefix %q, want %q", havePrefix, test.wantPrefix)
+ }
+ if !reflect.DeepEqual(haveParts, test.wantParts) {
+ t.Errorf("parseQueryString returned parts %#v, want %#v", haveParts, test.wantParts)
}
})
}