iskkonekb / kuvera

Система управленческого учета деятельности Ятры
MIT License
2 stars 0 forks source link

Похоже неверное понимание понятия Parent и SubQueries #13

Closed comdiv closed 7 years ago

comdiv commented 7 years ago

https://github.com/iskkonekb/kuvera/blob/9f30c1354cb10ee676d7daf1aae0a009c4a08f6f/iskkonekb.kuvera.model/Query.cs#L64

Эта строка ошибочная.

Есть 2 вида отношений между запросами

  1. Наследование, реализуется через свойство Parent - оно позволяет сделать базовый запрос или контектс его еще называют и указать его другому запросу и так передать в него общее условие. Например у нас есть заготовка запроса "сумма платежей за еду и за транспорт за вычетом домашней выпечки", в нем выставлена категория и допустим, что это расходы. Но мы же хотим этот запрос в разных контекстах, например по проекту или по дате. И есть задача выгнать большой отчет за 2 департамента за 3 месяца. Вот этот запрос "2 департамента 3 месяца" мы можем сделать контекстом , указать его всем запросам как Parent и соответственно все вычисления будут в этих рамках идти. Наследование буквально так и следует воспринимать "наследование свойств родителя", то есть "Conditions" ибо больше у Query ничего особо и нет

  2. Совсем другое дело - композиция запросов, которая реализуется через SubQueries - композиция разбивает вычисление наружнего запроса (контейнера) на внутренние (подзапросы). С родительско-наследственными отношениями это никак не связано. То есть у всех запросов в SubQueries могут быть разные Parent или не быть вообще - это никак не связано с контейнером. И SubQueries идут в увязке с QueryType= Sum, если QueryType - Primary, значит он сам по себе и есть первичный и далее не декомпозируется, если же он Sum, то нужно обсчитать все SubQueries и вычислить сумму.

Соответственно в строке 64 текущего файла Query

 /// <summary>
        /// Применить условия текущего запроса
        /// </summary>
        /// <typeparam name="T">Коллекция произвольного типа</typeparam>
        /// <param name="srcArr">Массив Исодных данных, для которыхх ппприменяются условия</param>
        /// <returns></returns>
        public virtual IEnumerable<T> Filter<T>(IEnumerable<T> srcArr)
        {
            var result = srcArr;
            //Фильтр родительского Query
            if (parent != null)
                result = parent.Filter(result);
            //Филтры по условиям текущего Query
            foreach (var x in where)
                result = x.Apply(result);
            //Применить условия подзапросов
            return FilterSubQueries(result);
        }

Эти вещи симешаны - FilterSubQueries(result) тут непричем - это ошибка - тут их быть не должно. И в постановке #6 этого и не было

Ой так вообще непраивльно

Например сделан QueryType и нигде не использован, собственно это часть Query должна была быть...

Собственно потому как с Engine надо было начать - одно тянет другое. Не в том порядке начали делать. И вот путаница пошла...

Brahmi108 commented 7 years ago

Фагим, в описании нашей задачи #6 https://github.com/iskkonekb/kuvera/issues/6 я не увидел вызова метода Apply для SubQueries. Метод CollectSubresults тоже его не выполняет вызывая collector. Так вот если collector должен сделать Apply применив условия для SubQueries тогда FilterSubQueries это аналог CollectSubresults. Но вызов его целесообразно сделать именно здесь по причине того, что это не является ответственность метода Sum запускать отдельные выборки из Query. Это воспитывать чужих детей (SubQueries = Childrens) :-)

Brahmi108 commented 7 years ago

corrected