public static IEnumerable <QueryCondition> ParseQueryConditions(this string query) { var stringSpan = new StringSpan(query); stringSpan.MoveToTheNextStartOfString(); while (!stringSpan.Eof) { var fieldName = stringSpan.ReadNextString(); var operation = stringSpan.ReadOperation(); if (operation == QueryOperation.In) { var value = stringSpan.ReadInValues(); yield return(new QueryCondition { FieldName = fieldName, Values = value.ToArray(), Operation = operation }); } else { var value = stringSpan.ReadNextString(); yield return(new QueryCondition { FieldName = fieldName, Values = value.ToSingleArray(), Operation = operation }); } stringSpan.MoveToTheNextStartOfString(); if (stringSpan.Eof) { break; } var logicalOperator = stringSpan.ReadNextString(); if (logicalOperator.ToLower() != "and") { throw new Exception("Only and logical operation is supported for a while"); } } }
private static QueryOperation ReadOperation(this StringSpan src) { var opString = src.ReadNextString(); return(opString.ParseQueryOperation()); }