示例#1
0
        private static double CalcQueryRank(Query query, string parentName, BoundingParameter[] parameters)
        {

            Func<string, string, bool> equals =
                (a, b) => string.Equals(a, b, StringComparison.InvariantCultureIgnoreCase);

            //отсев запросов, у которых есть параметры, не являющиеся родительским параметром или одним параметром из списка
            if (query.Arguments
                     .Where(k => !equals(k, parentName))
                     .Any(k => parameters.All(k2 => !equals(k2.Name, k))))
                return -1;

            double rank = 0.1;


            if (query.Arguments.Contains(parentName) && query.ArgCount == 1)
            {
                rank = 0.5;
            }
            else if (parameters.Length != 0)
            {
                var correctiveFloor = parameters.Max(k => k.Depth);
                //нужно перевести глубину параметров от текущей точки в рейтинг для текущей точки, т.е. перевернуть их все
                rank =
                   query.Arguments.Where(k => !equals(k, parentName)).Select(
                       k => correctiveFloor - parameters.Single(k2 => equals(k2.Name, k)).Depth + 1).Sum();
            }

            if (query.Arguments.Contains(parentName))
            {


                rank *= 2;

                if (query.SerialQueryIsPreferred(parentName))
                    rank += 1;
            }

            if (!string.IsNullOrEmpty(query.Namespace))
                rank *= 100;
            return rank;
        }