public override object VisitRestriction([NotNull] ChatParser.RestrictionContext context) { if (context.And() != null) { List <int> lhs = (List <int>)VisitRestriction(context.restriction(0)); List <int> rhs = (List <int>)VisitRestriction(context.restriction(1)); return(lhs.Intersect(rhs).ToList()); } else if (context.Or() != null) { List <int> lhs = (List <int>)VisitRestriction(context.restriction(0)); List <int> rhs = (List <int>)VisitRestriction(context.restriction(1)); lhs.AddRange(rhs); lhs.Sort(); return(lhs); } else if (context.Not() != null) { long tmp = LuceneService.DirReader.MaxDoc - 1; int msgCount = 1000000; if (msgCount > tmp) { msgCount = (int)tmp; } var numberList = Enumerable.Range(1, msgCount).ToList(); var excludeList = (List <int>)VisitRestriction(context.restriction(0)); return(numberList.Except(excludeList).ToList()); } else if (context.condition() != null) { return(VisitCondition(context.condition())); } else { return(VisitRestriction(context.restriction(0))); } }
/// <summary> /// Visit a parse tree produced by <see cref="ChatParser.restriction"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitRestriction([NotNull] ChatParser.RestrictionContext context) { return(VisitChildren(context)); }