Esempio n. 1
0
        public WhereClause(
            string formula,
            List <Entity> fields,
            Entity[] fieldsThenNonAggregatedFormulas)
        {
            _formula = EntityFormula.CreateEvaluator(formula, fields);
            var usedIndexes = _formula.GetVariableIndexes();

            IsBasedOnAggregation = EntityFormula.IsEvaluatorBasedOnAggregation(usedIndexes, fields);
            if (IsBasedOnAggregation)
            {
                return;
            }

            var usedResultIndexes = usedIndexes.Where(_ => _ < fields.Count).Select(_ => fields[_].ResultSetIndex).ToList();

            UsedEntities   = new List <Entity>();
            UnusedEntities = fieldsThenNonAggregatedFormulas.ToList();
            foreach (var ri in usedResultIndexes)
            {
                use(UnusedEntities.Single(_ => _.ResultSetIndex == ri));
            }

            foreach (var entity in UsedEntities.ToList())
            {
                foreach (var ri in entity.ReliesOnIndexes)
                {
                    use(fields.Single(_ => _.ResultSetIndex == ri));
                }
            }

            EntityClass.SortWithFormulasLast(UsedEntities);
            EntityClass.SortWithFormulasLast(UnusedEntities);
        }
        public override void ParentInitialized(EntityClass parent, int index)
        {
            Evaluator = CreateEvaluator(Spec.formula, parent.Fields);
            FieldType = Evaluator.ResultingType is RpnItemOperandNumeric
                ? typeof(double)
                : typeof(string);
            var variableIndexes = Evaluator.GetVariableIndexes();

            ReliesOnIndexes.UnionWith(variableIndexes);
            _isBasedOnAggregation = IsEvaluatorBasedOnAggregation(variableIndexes, parent.Fields);
        }