示例#1
0
        public override void AppendSql(StringBuilder sb, QueryFieldSet fieldSet)
        {
            if (Field == null)
            {
                sb.Append("(");
                var emitted = 0;

                foreach (var field in fieldSet.Fields)
                {
                    if (field.IsDefault)
                    {
                        if (EmitTermMatch(sb, field, emitted > 0))
                        {
                            emitted++;
                        }
                    }
                }

                sb.Append(")");
            }
            else
            {
                EmitTermMatch(sb, Field, false);
            }
        }
示例#2
0
        public virtual string ToSql(QueryFieldSet fieldSet)
        {
            var sb = new StringBuilder();

            AppendSql(sb, fieldSet);
            return(sb.ToString());
        }
示例#3
0
        public virtual string ToXml(QueryFieldSet fieldSet, bool pretty)
        {
            var doc = new XmlDocument();

            var request = doc.CreateElement("request");

            doc.AppendChild(request);

            var query = doc.CreateElement("query");

            query.SetAttribute("banshee-version", "1");
            request.AppendChild(query);

            AppendXml(doc, query, fieldSet);

            if (!pretty)
            {
                return(doc.OuterXml);
            }

            using (var sw = new StringWriter()) {
                using (var xtw = new XmlTextWriter(sw)) {
                    xtw.Formatting  = Formatting.Indented;
                    xtw.Indentation = 2;
                    doc.WriteTo(xtw);
                    return(sw.ToString());
                }
            }
        }
示例#4
0
        public override void AppendSql(StringBuilder sb, QueryFieldSet fieldSet)
        {
            if (ChildCount == 0)
            {
                return;
            }

            if (Keyword != Keyword.Not)
            {
                sb.Append("(");
                var first = true;
                foreach (var child in Children)
                {
                    if (!first)
                    {
                        sb.AppendFormat(" {0} ", Keyword);
                    }
                    else
                    {
                        first = false;
                    }
                    child.AppendSql(sb, fieldSet);
                }
                sb.Append(")");
            }
            else
            {
                sb.Append("NOT(");
                Children [0].AppendSql(sb, fieldSet);
                sb.Append(")");
            }
        }
示例#5
0
        public override QueryNode BuildTree(QueryFieldSet fieldSet)
        {
            field_set = fieldSet;
            var doc = new XmlDocument();

            try {
                doc.LoadXml(str);
                var request = doc.FirstChild as XmlElement;
                if (request == null || request.Name != "request")
                {
                    throw new Exception("Invalid request");
                }

                var query = request.FirstChild as XmlElement;
                if (query == null || query.Name != "query" || query.GetAttribute("banshee-version") != "1")
                {
                    throw new Exception("Invalid query");
                }

                var node = Parse(query.FirstChild as XmlElement, null);
                return((node != null) ? node.Trim() : null);
            } catch (Exception) {
            }
            return(null);
        }
示例#6
0
        public override QueryNode BuildTree(QueryFieldSet fieldSet)
        {
            field_set = fieldSet;
            root      = current_parent = new QueryListNode(Keyword.And);
            var last_was_term = false;

            while (true)
            {
                var token = Scan();

                if (token.ID == TokenID.Unknown)
                {
                    break;
                }

                token.Column = token_start_column;
                token.Line   = token_start_line;

                // If we have two terms in a row, put an AND between them
                if (last_was_term && token.ID == TokenID.Term)
                {
                    ParseToken(new QueryToken(TokenID.And));
                }

                ParseToken(token);

                last_was_term = token.ID == TokenID.Term;
            }

            return(root.Trim());
        }
示例#7
0
        public override void AppendXml(XmlDocument doc, XmlNode parent, QueryFieldSet fieldSet)
        {
            if (ChildCount == 0)
            {
                return;
            }

            var node = doc.CreateElement(Keyword.ToString().ToLower());

            parent.AppendChild(node);
            foreach (var child in Children)
            {
                child.AppendXml(doc, node, fieldSet);
            }
        }
示例#8
0
        public static QueryTermNode ParseUserQuery(QueryFieldSet field_set, string token)
        {
            var term = new QueryTermNode();

            // See if the query specifies a field, and if so, pull out the operator as well
            var field_alias = field_set.FindAlias(token);

            if (field_alias != null)
            {
                term.Field = field_set [field_alias];

                foreach (var val in term.Field.CreateQueryValues())
                {
                    term.Value = val;

                    var op_alias = term.Value.OperatorSet.FindAlias(token);
                    if (op_alias != null)
                    {
                        term.Operator = term.Value.OperatorSet [op_alias];
                        var field_separator = token.IndexOf(op_alias);
                        var temp            = token.Substring(field_separator + op_alias.Length);

                        term.Value.ParseUserQuery(temp);

                        if (!term.Value.IsEmpty)
                        {
                            break;
                        }
                    }

                    term.Operator = null;
                    term.Value    = null;
                }
            }

            if (term.Value == null)
            {
                term.Field    = null;
                term.Value    = QueryValue.CreateFromUserQuery(token, term.Field);
                term.Operator = StringQueryValue.Contains;
            }

            return(term);
        }
示例#9
0
        public override void AppendXml(XmlDocument doc, XmlNode parent, QueryFieldSet fieldSet)
        {
            var op_node = doc.CreateElement(op == null ? "contains" : op.Name);

            parent.AppendChild(op_node);

            var field = Field;

            if (field != null)
            {
                var field_node = doc.CreateElement("field");
                field_node.SetAttribute("name", field.Name);
                op_node.AppendChild(field_node);
            }

            var val_node = doc.CreateElement(Value.XmlElementName);

            Value.AppendXml(val_node);
            op_node.AppendChild(val_node);
        }
示例#10
0
 public string ToXml(QueryFieldSet fieldSet)
 {
     return(ToXml(fieldSet, false));
 }
示例#11
0
 public abstract void AppendSql(StringBuilder sb, QueryFieldSet fieldSet);
示例#12
0
 public abstract void AppendXml(XmlDocument doc, XmlNode parent, QueryFieldSet fieldSet);
示例#13
0
 public abstract QueryNode BuildTree(QueryFieldSet fieldSet);
示例#14
0
 public static QueryNode Parse(string input, QueryFieldSet fieldSet)
 {
     return(new XmlQueryParser(input).BuildTree(fieldSet));
 }