public static IExpression ParseEachTermWithPrefix(string query, string prefix, ITermCorrector corrector) { IExpression result = Parse(query, corrector); IExpression prefixExpression = null; string[] pieces = query.Split(' ', '\t', '\n', '\r'); foreach (string piece in pieces) { // Make sure no already prefixed item to be add a new prefix if (piece.Split(':').Length == 1) { if (piece.Length >= 2) { IExpression part = Parse(prefix + piece, corrector); prefixExpression = LogicOrExpression.Join(prefixExpression, part); } } } if (prefixExpression != null) { return(LogicAndExpression.Join(result, prefixExpression)); } else { return(new TermExpression("")); } }
/// <summary> /// Parse the search query by building a logic expression tree of single terms /// </summary> /// <param name="query">Original search query</param> /// <param name="corrector">Correct single term into an expression</param> /// <returns>Expression tree (Join AndExpression for different terms and join OrExpression for corrections)</returns> public static IExpression Parse(string query, ITermCorrector corrector) { if (String.IsNullOrEmpty(query)) { return(new TermExpression(String.Empty)); } query = query.ToLowerInvariant(); string[] pieces = query.Split(' ', '\t', '\n', '\r'); IExpression result = null; foreach (string piece in pieces) { IExpression expr = null; // Scan the possibilities of AndNot and Or if (piece.Length > 1) { if (piece.Contains('|')) { string[] orPieces = piece.Split('|'); foreach (string orPiece in orPieces) { expr = LogicOrExpression.Join(expr, Parse(orPiece, corrector)); } result = LogicAndExpression.Join(result, expr); continue; } else if (piece[0] == '-') { expr = ParseTerm(piece.Substring(1), corrector); result = LogicAndNotExpression.Join(result, expr); continue; } } // By default, use And to connect expr = ParseTerm(piece, corrector); result = LogicAndExpression.Join(result, expr); } return(result); }