1 package org.simantics.workbench.search;
\r
4 import java.io.IOException;
\r
6 import java.net.URLDecoder;
\r
7 import java.net.URLEncoder;
\r
8 import java.util.Collections;
\r
9 import java.util.HashMap;
\r
10 import java.util.HashSet;
\r
11 import java.util.Map;
\r
12 import java.util.Set;
\r
14 import org.simantics.db.layer0.genericrelation.IndexQueries;
\r
16 public class SearchQuery {
\r
18 private String originalQuery;
\r
19 private Map<String,String> searchFlags = new HashMap<String, String>();
\r
20 private Set<String> searchParams = new HashSet<String>();
\r
22 public SearchQuery() {
\r
25 public SearchQuery(String originalQuery) {
\r
26 this.originalQuery = originalQuery;
\r
29 public void setOriginalQuery(String originalQuery) {
\r
30 this.originalQuery = originalQuery;
\r
33 public String getOriginalQuery() {
\r
34 return originalQuery;
\r
37 public String getQuery(Set<String> supportedParams) {
\r
38 if (originalQuery.trim().isEmpty())
\r
42 for (String key : searchFlags.keySet()) {
\r
43 if (!supportedParams.contains(key))
\r
45 if (!"on".equals(searchFlags.get(key)))
\r
49 // String prefix = originalQuery.startsWith("*") ? "" : "*";
\r
50 // String suffix = originalQuery.endsWith("*") ? "" : "*";
\r
51 // query += key+":"+prefix+originalQuery+suffix;
\r
52 query += key+":"+originalQuery;
\r
58 public String getQuery(String... supportedParams) {
\r
59 Set<String> set = new HashSet<String>();
\r
60 for (String s : supportedParams)
\r
62 return getQuery(set);
\r
67 public void setSearchFlag(String key, String value) {
\r
68 searchFlags.put(key, value);
\r
71 public void setSearchParam(String key) {
\r
72 searchParams.add(key);
\r
75 public Map<String, String> getSearchFlags() {
\r
76 return Collections.unmodifiableMap(searchFlags);
\r
79 public Set<String> getSearchParams() {
\r
80 return Collections.unmodifiableSet(searchParams);
\r
83 public boolean getBooleanFlag(String key) {
\r
84 if ("on".equals(searchFlags.get(key)))
\r
89 public boolean getBooleanParam(String key) {
\r
90 if (searchParams.contains(key))
\r
96 public String toString() {
\r
97 return originalQuery;
\r
100 public SearchQuery withOriginalQuery(String query) {
\r
101 SearchQuery ret = new SearchQuery(query);
\r
102 ret.searchFlags = new HashMap<String, String>(searchFlags);
\r
103 ret.searchParams = new HashSet<String>(searchParams);
\r
107 public SearchQuery escaped(boolean escapeWildcards) {
\r
108 return withOriginalQuery( IndexQueries.escape( originalQuery, escapeWildcards ) );
\r
111 public static URL encode(File file, SearchQuery query) throws IOException {
\r
112 URL url = file.toURI().toURL();
\r
113 String s = url.toString() + "?search=" + URLEncoder.encode(query.getOriginalQuery(), "UTF-8");
\r
114 Map<String, String> flags = query.getSearchFlags();
\r
115 for (String key : flags.keySet()) {
\r
116 s += "&"+key+"="+flags.get(key);
\r
119 for (String param : query.getSearchParams()) {
\r
127 public static SearchQuery decode(URL url) throws IOException{
\r
128 String query = url.getQuery();
\r
129 SearchQuery searchQuery = new SearchQuery();
\r
130 if (query != null) {
\r
131 for (String arg : query.split("&")) {
\r
132 String[] keyvalue = arg.split("=");
\r
133 if ("search".equals(keyvalue[0])) {
\r
134 if (keyvalue.length == 2)
\r
135 searchQuery.setOriginalQuery(URLDecoder.decode(keyvalue[1], "UTF-8"));
\r
136 } else if (keyvalue.length == 2){
\r
137 searchQuery.setSearchFlag(URLDecoder.decode(keyvalue[0], "UTF-8"), URLDecoder.decode(keyvalue[1], "UTF-8"));
\r
138 } else if (keyvalue.length == 1) {
\r
139 searchQuery.setSearchParam(URLDecoder.decode(keyvalue[0], "UTF-8"));
\r
143 return searchQuery;
\r