public PriorityConditions GetPriorityConditions(string query)
        {
            PriorityConditions priorityConditions = new PriorityConditions();

            string regexp;

            try
            {
                //Проверяем есть ли условие по очереди на скиллах
                if ((bool)CheckRegexIsMatch(query, @"queue \w+"))
                {
                    //Проверяем очередь только на одном из скиллов
                    if ((bool)CheckRegexIsMatch(query, @"queue in \(\w+"))
                    {
                        priorityConditions.queueSingle = true;
                    }

                    //Проверяем очередь на всех скиллах списка
                    if ((bool)CheckRegexIsMatch(query, @"queue in each \(\w+"))
                    {
                        priorityConditions.queueMultiple = true;
                    }

                    //Получаем список скиллов
                    regexp = @"\((\w+\,{0,})+\)";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        string skillsStr = (string)CheckRegexIsMatch(query, regexp, true);
                        priorityConditions.skills = ParseSkills(skillsStr, ',', new char[] { '(', ')' });
                    }

                    //Получаем знак сравнения для очереди
                    regexp = @"\) <|>|<=|>=|== \d+";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        priorityConditions.signQueue = (string)CheckRegexIsMatch(query, regexp, true);
                    }

                    //Получаем значение очереди
                    regexp = @"\) .{1,2} \d+";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        priorityConditions.queueVal = GetIntAfterSign(query, regexp);
                    }

                    regexp = @"queue.*\) (<|>|<=|>=|=) \d+ then priority = \d+";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        priorityConditions.priorityWhenQ = GetIntAfterSign(query, regexp);
                    }
                }

                if ((bool)CheckRegexIsMatch(query, @"timewait > \d+"))
                {
                    priorityConditions.timeWait = true;

                    regexp = @"timewait <|>|<=|>=|== \d+";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        priorityConditions.signTimeWait = (string)CheckRegexIsMatch(query, regexp, true);
                    }

                    regexp = @"timewait .{1,2} \d+";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        priorityConditions.timeWaitVal = GetIntAfterSign(query, regexp);
                    }

                    regexp = @"timeWait.(<|>|<=|>=|=) \d+ then priority = \d+";
                    if ((bool)CheckRegexIsMatch(query, regexp))
                    {
                        priorityConditions.priorityWhenTimeW = GetIntAfterSign(query, regexp);
                    }
                }

                regexp = @" and ";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.unitCondition = 1;
                }

                regexp = @" or ";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.unitCondition = -1;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Не удалось распарсить запрос, описывающий приоритизацию\n" + e.Message, "Ошибка приоритизации", MessageBoxButton.OK, MessageBoxImage.Error);
                return(null);
            }

            return(priorityConditions);
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            //string query = "if queue in each (skill1,skill2,skill3,skill4) > 50 then priority = 4 and timeWait > 3 then priority = 2";
            //string query = "if timeWait > 1 then priority = 1 and queue in (skill1,skill2,skill3,skill4) > 10 then priority = 3";
            //string query = "if timeWait > 3 then priority = 2";
            //string query = "if queue in (skill1,skill2,skill3,skill4) > 50 then priority = 4";
            string query = "if queue in each (skill1,skill2) > 50 then priority = 4 or timeWait > 3 then priority = 2";

            PriorityConditions priorityConditions = new PriorityConditions();

            string regexp;

            //Проверяем есть ли условие по очереди на скиллах
            if ((bool)CheckRegexIsMatch(query, @"queue \w+"))
            {
                //Проверяем очередь только на одном из скиллов
                if ((bool)CheckRegexIsMatch(query, @"queue in \(\w+"))
                {
                    priorityConditions.queueSingle = true;
                }

                //Проверяем очередь на всех скиллах списка
                if ((bool)CheckRegexIsMatch(query, @"queue in each \(\w+"))
                {
                    priorityConditions.queueMultiple = true;
                }

                //Получаем список скиллов
                regexp = @"\((\w+\,{0,})+\)";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    string skillsStr = (string)CheckRegexIsMatch(query, regexp, true);
                    priorityConditions.skills = ParseSkills(skillsStr, ',', new char[] { '(', ')' });
                }

                //Получаем знак сравнения для очереди
                regexp = @"\) <|>|<=|>=|== \d+";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.signQueue = (string)CheckRegexIsMatch(query, regexp, true);
                }

                //Получаем значение очереди
                regexp = @"\) .{1,2} \d+";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.queueVal = GetIntAfterSign(query, regexp);
                }

                regexp = @"queue.*\) (<|>|<=|>=|=) \d+ then priority = \d+";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.priorityWhenQ = GetIntAfterSign(query, regexp);
                }
            }

            if ((bool)CheckRegexIsMatch(query, @"timewait > \d+"))
            {
                priorityConditions.timeWait = true;

                regexp = @"timewait <|>|<=|>=|== \d+";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.signTimeWait = (string)CheckRegexIsMatch(query, regexp, true);
                }

                regexp = @"timewait .{1,2} \d+";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.timeWaitVal = GetIntAfterSign(query, regexp);
                }

                regexp = @"timeWait.(<|>|<=|>=|=) \d+ then priority = \d+";
                if ((bool)CheckRegexIsMatch(query, regexp))
                {
                    priorityConditions.priorityWhenTimeW = GetIntAfterSign(query, regexp);
                }
            }

            regexp = @" and ";
            if ((bool)CheckRegexIsMatch(query, regexp))
            {
                priorityConditions.unitCondition = 1;
            }

            regexp = @" or ";
            if ((bool)CheckRegexIsMatch(query, regexp))
            {
                priorityConditions.unitCondition = -1;
            }

            if (!priorityConditions.queueSingle && priorityConditions.queueMultiple && priorityConditions.timeWait && priorityConditions.signTimeWait == ">" && priorityConditions.signQueue == ">" &&
                priorityConditions.queueVal == 50 &&
                priorityConditions.timeWaitVal == 3 && priorityConditions.priorityWhenQ == 4 && priorityConditions.skills.Count == 2 && priorityConditions.unitCondition == -1 &&
                priorityConditions.priorityWhenTimeW == 2
                )
            {
                Console.WriteLine("Success");

                foreach (var skill in priorityConditions.skills)
                {
                    Console.WriteLine(skill);
                }
            }

            Console.ReadLine();
        }