diff --git a/source/java/org/alfresco/web/bean/SearchContext.java b/source/java/org/alfresco/web/bean/SearchContext.java index f1e183c6ca..463cd5a181 100644 --- a/source/java/org/alfresco/web/bean/SearchContext.java +++ b/source/java/org/alfresco/web/bean/SearchContext.java @@ -50,6 +50,9 @@ import org.dom4j.io.XMLWriter; /** * Holds the context required to build a search query and can return the populated query. + *
+ * Builds a lucene format search string from each of the supplied attributes and terms.
+ * Can be serialized to and from XML format for saving and restoring of previous searches.
*
* @author Kevin Roast
*/
@@ -78,6 +81,11 @@ public final class SearchContext implements Serializable
private static final String ELEMENT_SEARCH = "search";
private static final String ELEMENT_QUERY = "query";
+ /** advanced search term operators */
+ private static final char OP_WILDCARD = '*';
+ private static final char OP_AND = '+';
+ private static final char OP_NOT = '-';
+
/** Search mode constants */
public final static int SEARCH_ALL = 0;
public final static int SEARCH_FILE_NAMES_CONTENTS = 1;
@@ -141,19 +149,19 @@ public final class SearchContext implements Serializable
if (text.indexOf(' ') == -1 && text.charAt(0) != '"')
{
// simple single word text search
- if (text.charAt(0) != '*')
+ if (text.charAt(0) != OP_WILDCARD)
{
// escape characters and append the wildcard character
String safeText = QueryParser.escape(text);
- fullTextQuery = " TEXT:" + safeText + '*';
- nameAttrQuery = " @" + nameAttr + ":" + safeText + '*';
+ fullTextQuery = " TEXT:" + safeText + OP_WILDCARD;
+ nameAttrQuery = " @" + nameAttr + ":" + safeText + OP_WILDCARD;
}
else
{
// found a leading wildcard - prepend it again after escaping the other characters
String safeText = QueryParser.escape(text.substring(1));
- fullTextQuery = " TEXT:*" + safeText + '*';
- nameAttrQuery = " @" + nameAttr + ":*" + safeText + '*';
+ fullTextQuery = " TEXT:*" + safeText + OP_WILDCARD;
+ nameAttrQuery = " @" + nameAttr + ":*" + safeText + OP_WILDCARD;
}
}
else
@@ -161,7 +169,7 @@ public final class SearchContext implements Serializable
// multiple word search
if (text.charAt(0) == '"' && text.charAt(text.length() - 1) == '"')
{
- // as quoted phrase
+ // as a single quoted phrase
String quotedSafeText = '"' + QueryParser.escape(text.substring(1, text.length() - 1)) + '"';
fullTextQuery = " TEXT:" + quotedSafeText;
nameAttrQuery = " @" + nameAttr + ":" + quotedSafeText;
@@ -174,25 +182,45 @@ public final class SearchContext implements Serializable
StringBuilder nameAttrBuf = new StringBuilder(64);
fullTextBuf.append('(');
nameAttrBuf.append('(');
- while (t.hasMoreTokens())
+ int tokenCount = t.countTokens();
+ for (int i=0; i