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) } }) }