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); }