Exemplo n.º 1
0
        public IFilter Parse()
        {
            var tokenizer = new Tokenizer(Filter);

            tokens = tokenizer.Tokenize();
            pos = -2;

            string conjunction;
            ListFilter.JoinType joinType;
            FilterSet filter = new FilterAndSet();
            IFilter thisFilter;
            IFilter last;
            FilterOrSet orSet;

            while (++pos < tokens.Count)
            {
                conjunction = pos == -1 ? "," : tokens[pos];

                var name = GetNextToken("field name");
                var oper = GetNextToken("operator");
                var value = GetNextToken("value");

                if (Tokens.IsListStart(value))
                {
                    joinType = ListFilter.JoinType.And;
                    var values = new List<string>();
                    while (!Tokens.IsListEnd(tokens[pos]) && !Tokens.IsListEnd(GetNextToken("value")))
                    {
                        values.Add(tokens[pos]);
                        if (GetNextToken("conjunction or list end") == "|")
                            joinType = ListFilter.JoinType.Or;
                    }
                    thisFilter = new ListFilter(name, oper, values, joinType);
                }
                else
                    thisFilter = new Filter(name, oper, value);

                if (conjunction == ",") // and
                    filter.Add(thisFilter);
                else if (conjunction == "|") // or
                {
                    last = filter.Last();
                    if (!(last is FilterOrSet))
                    {
                        filter.RemoveAt(filter.Count - 1);
                        orSet = new FilterOrSet();
                        orSet.Add(last);
                        orSet.Add(thisFilter);
                        filter.Add(orSet);
                    }
                    else
                        ((FilterOrSet)last).Add(thisFilter);
                }
                else
                    throw new ParseException("Parser: Unexpected '{0}', expected conjunction instead.", conjunction);
            }

            return filter;
        }
Exemplo n.º 2
0
        public IFilter Parse()
        {
            var tokenizer = new Tokenizer(Filter);

            tokens = tokenizer.Tokenize();
            pos = -2;

            string conjunction;
            FilterSet filter = new FilterAndSet();
            Filter thisFilter;
            IFilter last;
            FilterOrSet orSet;

            while (++pos < tokens.Count)
            {
                conjunction = pos == -1 ? "," : tokens[pos];
                thisFilter = new Filter(GetNextToken("field name"), GetNextToken("operator"), GetNextToken("value"));
                if (conjunction == ",") // and
                    filter.Add(thisFilter);
                else if (conjunction == "|") // or
                {
                    last = filter.Last();
                    if (!(last is FilterOrSet))
                    {
                        filter.RemoveAt(filter.Count - 1);
                        orSet = new FilterOrSet();
                        orSet.Add(last);
                        orSet.Add(thisFilter);
                        filter.Add(orSet);
                    }
                    else
                        ((FilterOrSet)last).Add(thisFilter);
                }
                else
                    throw new ParseException("Parser: Unexpected '{0}', expected conjunction instead.", conjunction);
            }

            return filter;
        }