| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package app |
| |
| import "strings" |
| |
| // 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"} |
| // The vs and | separators must not be quoted. |
| func parseQueryString(q string) []string { |
| var queries []string |
| var parts []string |
| var prefix string |
| quoting := false |
| for r := 0; r < len(q); { |
| switch c := q[r]; { |
| case c == '"' && quoting: |
| quoting = false |
| r++ |
| case quoting: |
| if c == '\\' { |
| r++ |
| } |
| r++ |
| case c == '"': |
| quoting = true |
| r++ |
| case c == ' ', c == '\t': |
| switch part := q[:r]; { |
| case part == "|" && prefix == "": |
| prefix = strings.Join(parts, " ") + " " |
| parts = nil |
| case part == "vs": |
| queries = append(queries, prefix+strings.Join(parts, " ")) |
| parts = nil |
| default: |
| parts = append(parts, part) |
| } |
| q = q[r+1:] |
| r = 0 |
| default: |
| if c == '\\' { |
| r++ |
| } |
| r++ |
| } |
| } |
| if len(q) > 0 { |
| parts = append(parts, q) |
| } |
| if len(parts) > 0 { |
| queries = append(queries, prefix+strings.Join(parts, " ")) |
| } |
| return queries |
| } |